我有两个csv文件。我在没有csv阅读器的情况下阅读本文,因为行中存在不一致 - 有些行有引号而有些行没有,这就是扔掉csv阅读器。这些文件格式相同,但具有不同的条目,所以它们看起来像这样:
a b c d e f g h i j h i j k
"a b c d e f g h i j h i j k j"
"a b c d e f g h i j h i j k j"
我需要做的是找到文件1和文件2中第三列(c)具有相同值的所有行。请注意,其余值将完全不同,所以我不认为像difflib这样的东西会起作用,除非我错过了什么。
起初我尝试使用嵌套的for循环 - 类似这样的
for line in fileOne:
entry=line.split()
print ("A")
for row in fileTwo:
space=row.split
print ("B")
if space[2]=entry[2]:
outputHandle.write(line)
但我发现使用打印语句输出
A
B
B
B
A
A
我需要脚本来检查第一个文件中每一行的第二个文件的所有行,所以它看起来像这样:
A
B
B
B
A
B
B
B....etc
(这是非常昂贵的,我知道。但我只是盯着看,不知道如何更有效地做到这一点,可悲的是)
我也尝试过使用一个函数:
def file_check(variableName):
for row in fileTwo:
return("B")
if entry in row:
return ("found")
return("not found")
for line in fileOne:
entry= line.split()
print ("A")
var=file_check(entry[2])
print (var)
这输出: 一个 ('未找到') 一个 ('未找到') 一个 ('未找到')
由于我使用的是测试文件,因此我知道存在匹配的条目,所以这也不是循环遍历第二个文件,而只是检查第一行。
很抱歉提出这样一个基本问题,StackOverflowians,但这次我真的很难过。 任何建议都欢迎和赞赏!
注意:此问题之前已被问过,但答案仅适用于Python 2,python 3的csv模块似乎真的不同。这是此问题的先前版本: Comparing two CSV Files Based on Specific Data in two Columns
答案 0 :(得分:2)
我不确定你是否想要找到B中有多少行具有与字段3相同的值,如文件A中的每一行,或者匹配来自两个共享相同行的文件中的行第3场的价值......我将假设后者。
如何在开始之前按第三列排序每个文件的行?
如果您这样做,那么您可以读取文件A,并且每次文件A在字段3中的值发生变化时,使用该新值打印A中的记录,然后切换到处理文件B:< / p>
Arecord = read file A
while not EOF on file A:
currentKey = field 3 of Arecord
print "\n" + Arecord
Arecord = read file A
while field 3 of Arecord == currentKey
print Arecord
while field 3 of Brecord < currentKey:
Brecord = read file B
while field 3 of Brecord == currentKey:
print Brecord
因为您已经按字段3对这两个文件进行了排序,所以这将使您的结果快速通过。
如果出于某种原因需要在最后按顺序返回行,请在开始之前将其原始记录编号添加为附加字段,然后按其排序,然后删除该额外字段。
如果你添加一个额外的字段来说明每行来自哪个文件,那么你可以把文件放在一起并按两个键排序:字段3和&#34;我来自哪个文件&#34;字段,并一次性获得结果。
警告:通常的* nix&#34;排序&#34;命令(像大多数/所有其他* nix&#34;字段&#34;相关命令)不能处理引用字段。因此,您可能必须首先进行引用。 &#34;排序&#34;对于Unicode也不满意,所以如果你的数据中有任何非ASCII字符使用&#34; msort&#34;或者其他东西。希望有所帮助。
答案 1 :(得分:1)
您需要浏览每个文件中的每一行,并split()
将它们放入数组中,以便比较它们。尝试这样的事情:
with open("file1") as file1, open("file2") as file2: for row1 in file 1: row1=row1.split() for row2 in file2: row2=row2.split() if row1[2]==row2[2]: print("found")
如果您还需要取出字符串中的引号,您可以试试这样的话:
row1=row1.split() for i in range (len(row1)): row1[i]=row1[i].replace("\"", "")
这将用空字符串替换每个引号。
答案 2 :(得分:0)
我会按照以下方式尝试:
import pandas as pd
df1 = pd.read_csv(f1)
df2 = pd.read_csv(f2)
df1['same'] = df1[2] == df2[2]
应该为您提供一个True/False
数组,显示行相同/不同的位置。