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

标签 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   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)

输出: A ('未找到') A ('未找到') A ('未找到')

由于我使用的是测试文件,我知道存在匹配的条目,因此这也不会循环访问第二个文件,而是仅检查第一行。

很抱歉问这样一个基本问题,StackOverflowians,但这次我真的陷入困境。 欢迎并赞赏任何建议!

注意:这个问题之前已经被问过,但答案仅适用于 Python 2,python 3 的 csv 模块似乎确实不同。这是这个问题的先前版本: Comparing two CSV Files Based on Specific Data in two Columns

最佳答案

我不确定您是否想要查找 B 中的多少行与文件 A 中的每一行具有相同的字段 3 值,或者匹配两个文件中共享相同字段 3 值的行字段 3...我假设是后者。

在开始之前按第三列对每个文件的行进行排序怎么样?

如果这样做,那么您可以读取文件 A,并且每次文件 A 在字段 3 中的值发生更改时,使用该新值打印 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

因为您已经按字段 3 对两个文件进行了排序,所以这将快速获得结果。

如果由于某种原因您需要在末尾按顺序恢复行,请在开始之前将其原始记录号添加为附加字段,然后按该字段排序,然后删除该附加字段。

如果您添加一个额外的字段来说明每行来自哪个文件,那么您可以将文件放在一起并按两个键排序:字段 3 和“我来自哪个文件”字段,然后在中获取结果一枪。

警告:通常的 *nix“排序”命令(像大多数/所有其他 *nix“字段”相关命令一样)无法处理带引号的字段。所以你可能必须首先摆脱引用。 “sort”也不满意 Unicode,因此如果数据中有任何非 ASCII 字符,请使用“msort”或其他字符。

希望有帮助。

关于python - 比较 CSV 文件 - python 3(初学者),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24002927/

相关文章:

python - 如何改进 NLTK 句子分割?

python - 更新 csv 文件中的特定行

bash - 检查文件中的行是否具有相同的列数

ubuntu - Python 3,Scrypt 模块,哈希不匹配

python - 无法使用正则表达式查找 pandas 中值集的子字符串的第一次出现

sql - 使用雪花连接器在雪花中通过 python 执行 SQL 查询时,列名称为 0、1、2、3

Excel 输出中的 Python Pandas 自定义时间格式

python - KNN : Found input variables with inconsistent numbers of samples: [20, 499]

python - 包含模板中的 Jinja2 变量

python - CsvReader 下一个函数