比较CSV文件-python 3(初学者)
我有两个csv文件。我在没有csv阅读器的情况下阅读这篇文章,因为行中有不一致之处——有些行有引文,有些没有,这是在抛弃csv阅读器。这两个文件的格式相同,但有不同的条目,因此它们看起来像这样:比较CSV文件-python 3(初学者),python,csv,python-3.x,Python,Csv,Python 3.x,我有两个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
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"
A
B
B
B
A
B
B
B....etc
我需要做的是找到文件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 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"
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)
这将产生:
A.
(“未找到”)
A.
(“未找到”)
A.
(“未找到”)
因为我使用的是测试文件,所以我知道有匹配的条目,所以这也不是在第二个文件中循环,而是只检查第一行
很抱歉问这么一个基本的问题,StackOverflovians,但这次我真的被卡住了。
欢迎提供任何建议,并表示感谢
注意:这个问题以前有人问过,但答案只适用于Python2,Python3的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"
A
B
B
B
A
B
B
B....etc
打开(“文件1”)作为文件1,打开(“文件2”)作为文件2:
对于文件1中的行1:
row1=row1.split()
对于文件2中的行2:
row2=row2.split()
如果第1行[2]==第2行[2]:
打印(“找到”)
如果您还需要去掉字符串中的引号,可以尝试以下方法:
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"
A
B
B
B
A
B
B
B....etc
row1=row1.split()
对于范围内的i(len(row1)):
行1[i]=行1[i]。替换(“\”,“”)
这将用空字符串替换每个引号。我不确定您的意思是要查找B中有多少行与文件A中的每一行具有相同的字段3值,还是要匹配两个文件中共享相同字段3值的行……我将假设后者 在开始之前,按照第三列对每个文件的行进行排序如何 如果这样做,则可以向下读取文件A,并且每当字段3中文件A的值发生变化时,使用该新值打印A中的记录,然后切换到处理文件B:
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
Arecord=读取文件A
虽然不是文件A上的EOF:
currentKey=A记录的字段3
打印“\n”+记录
Arecord=读取文件A
而Arecord的字段3==currentKey
打印记录
当Brecord的字段3
因为您已经按字段3对两个文件进行了排序,所以这将在一次快速传递中得到结果
如果出于某种原因,您需要在末尾按顺序重新排列这些行,请在开始之前将其原始记录编号添加为一个附加字段,然后按该字段排序,然后删除该附加字段
如果您添加一个额外的字段,说明每行来自哪个文件,那么您可以将这些文件放在一起,并按两个键进行排序:字段3和“我来自哪个文件”字段,并一次性获得结果
警告:通常的*nix“sort”命令(与大多数/所有其他与*nix“field”相关的命令一样)无法处理带引号的字段。因此,您可能必须先获得带引号的RID。“sort”也不喜欢使用Unicode,因此,如果数据中有任何非ASCII字符,请使用“msort”或其他类似命令
希望能有所帮助。我会尝试以下几点:
import pandas as pd
df1 = pd.read_csv(f1)
df2 = pd.read_csv(f2)
df1['same'] = df1[2] == df2[2]
这将为您提供一个
True/False
数组,显示行的相同/不同之处。是的,这就是我基本上使用的嵌套for循环。但是,正如我所指出的,由于某种原因,这并没有实际扫描第二个文件中的所有行。在每个循环中使用一些print语句进行尝试,您可能会看到我所说的内容t、 您应该单独测试该部分,因为这似乎不太可能。我意识到,问题是,当for循环到达第二次运行的file2时,指针位于第二个文件的底部。因此,如果您在第二次for循环之前倒回光标,您的代码将完美运行!如果您将答案编辑为包含“file2.seek!”(0)“在您的回答中,我将“接受”它。感谢您的帮助!谢谢,这是一种很酷的方式。事实上,我正在寻找后一种方式,即您描述的方式,因此它肯定很有帮助。