在另一个文件中搜索一个文件的行并在 python 中打印适当的行
Searching rows of a file in another file and printing appropriate rows in python
我有一个这样的 csv 文件:(没有 headers)
aaa,1,2,3,4,5
bbb,2,3,4,5,6
ccc,3,5,7,8,5
ddd,4,6,5,8,9
我想搜索另一个 csv 文件:(没有 headers)
bbb,1,2,3,4,5,,6,4,7
kkk,2,3,4,5,6,5,4,5,6
ccc,3,4,5,6,8,9,6,9,6
aaa,1,2,3,4,6,6,4,6,4
sss,1,2,3,4,5,3,5,3,5
并打印存在于第一个文件中的第二个文件中的行(基于第一列的匹配)。所以结果将是:
bbb,1,2,3,4,5,,6,4,7
ccc,3,4,5,6,8,9,6,9,6
aaa,1,2,3,4,6,6,4,6,4
我有以下代码,但它没有打印任何东西:
labels = []
with open("csv1.csv", "r") as f:
f.readline()
for line in f:
labels.append((line.strip("\n")))
with open("csv2.csv", "r") as f:
f.readline()
for line in f:
if (line.split(",")[1]) in labels:
print (line)
如果可能的话,你能告诉我怎么做吗?我的代码有什么问题?提前致谢!
- 尝试使用 pandas,这是一种将 csv 文件读入称为数据帧的数据结构的非常有效的方法。
编辑
labels = []
with open("csv1.csv", "r") as f:
f.readline()
for line in f:
labels.append((line.split(',')[0])
with open("csv2.csv", "r") as f:
f.readline()
for line in f:
if (line.split(",")[0]) in labels:
print (line)
我这样标签只包含字符串的第一部分所以 ['aaa','bbb', etc]
然后你想检查line.split(",")[0]
是否在标签
中
由于您只想根据第一列进行匹配,因此您应该使用拆分,然后从索引 0 处的拆分中获取第一项。
这是一个解决方案,尽管您也可以按照建议查看特定于 csv 的工具和 pandas:
labels = []
with open("csv1.csv", "r") as f:
lines = f.readlines()
for line in lines:
labels.append(line.split(',')[0])
with open("csv2.csv", "r") as f:
lines = f.readlines()
with open("csv_out.csv", "w") as out:
for line in lines:
temp = line.split(',')
if any(temp[0].startswith(x) for x in labels):
out.write((',').join(temp))
该程序首先只收集来自 csv1.csv
的标签 - 请注意,您使用了 readline
,程序似乎希望一次读取文件中的所有行。一种方法是使用 readlines
。该程序还必须从 readlines
收集行 - 此处它将它们存储在名为 lines
的列表中。为了收集标签,程序循环遍历每一行,用 ,
拆分并将第一个元素附加到带有标签 labels
.
的数组中
在第二部分中,程序从 csv2.csv
读取所有行,同时打开文件写入输出 csv.out
。它逐行处理来自 csv2.csv
的行,同时将目标文件写入输出文件。
为此,程序再次按 ,
拆分每一行,并查看是否在 labels
数组中找到来自 csv2
的标签。如果是,该行将写入 csv_out.csv
.
我有一个这样的 csv 文件:(没有 headers)
aaa,1,2,3,4,5
bbb,2,3,4,5,6
ccc,3,5,7,8,5
ddd,4,6,5,8,9
我想搜索另一个 csv 文件:(没有 headers)
bbb,1,2,3,4,5,,6,4,7
kkk,2,3,4,5,6,5,4,5,6
ccc,3,4,5,6,8,9,6,9,6
aaa,1,2,3,4,6,6,4,6,4
sss,1,2,3,4,5,3,5,3,5
并打印存在于第一个文件中的第二个文件中的行(基于第一列的匹配)。所以结果将是:
bbb,1,2,3,4,5,,6,4,7
ccc,3,4,5,6,8,9,6,9,6
aaa,1,2,3,4,6,6,4,6,4
我有以下代码,但它没有打印任何东西:
labels = []
with open("csv1.csv", "r") as f:
f.readline()
for line in f:
labels.append((line.strip("\n")))
with open("csv2.csv", "r") as f:
f.readline()
for line in f:
if (line.split(",")[1]) in labels:
print (line)
如果可能的话,你能告诉我怎么做吗?我的代码有什么问题?提前致谢!
- 尝试使用 pandas,这是一种将 csv 文件读入称为数据帧的数据结构的非常有效的方法。
编辑
labels = []
with open("csv1.csv", "r") as f:
f.readline()
for line in f:
labels.append((line.split(',')[0])
with open("csv2.csv", "r") as f:
f.readline()
for line in f:
if (line.split(",")[0]) in labels:
print (line)
我这样标签只包含字符串的第一部分所以 ['aaa','bbb', etc]
然后你想检查line.split(",")[0]
是否在标签
由于您只想根据第一列进行匹配,因此您应该使用拆分,然后从索引 0 处的拆分中获取第一项。
这是一个解决方案,尽管您也可以按照建议查看特定于 csv 的工具和 pandas:
labels = []
with open("csv1.csv", "r") as f:
lines = f.readlines()
for line in lines:
labels.append(line.split(',')[0])
with open("csv2.csv", "r") as f:
lines = f.readlines()
with open("csv_out.csv", "w") as out:
for line in lines:
temp = line.split(',')
if any(temp[0].startswith(x) for x in labels):
out.write((',').join(temp))
该程序首先只收集来自 csv1.csv
的标签 - 请注意,您使用了 readline
,程序似乎希望一次读取文件中的所有行。一种方法是使用 readlines
。该程序还必须从 readlines
收集行 - 此处它将它们存储在名为 lines
的列表中。为了收集标签,程序循环遍历每一行,用 ,
拆分并将第一个元素附加到带有标签 labels
.
在第二部分中,程序从 csv2.csv
读取所有行,同时打开文件写入输出 csv.out
。它逐行处理来自 csv2.csv
的行,同时将目标文件写入输出文件。
为此,程序再次按 ,
拆分每一行,并查看是否在 labels
数组中找到来自 csv2
的标签。如果是,该行将写入 csv_out.csv
.