比较CSV文件-python 3(初学者)

比较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

我有两个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"
 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)“在您的回答中,我将“接受”它。感谢您的帮助!谢谢,这是一种很酷的方式。事实上,我正在寻找后一种方式,即您描述的方式,因此它肯定很有帮助。