【问题标题】:How to compare two csv files in Python如何在 Python 中比较两个 csv 文件
【发布时间】:2016-02-28 18:50:10
【问题描述】:

我有两个 csv 文件。一个叫“Standard reg.csv”,另一个叫“Driver Details.csv”

在“标准 reg.csv”中,前两行是:

['Day', 'Month', 'Year', 'Reg Plate', 'Hour', 'Minute', 'Second', 'Speed over limit']
['1', '1', '2016', 'NU16REG', '1', '1', '1', '5816.1667859699355']

Driver Details.csv 中的前两行是:

['FirstName', 'LastName', 'StreetAddress', 'City', 'Region', 'Country', 'PostCode', 'Registration']
['Violet', 'Kirby', '585-4073 Convallis Street', 'Balfour', 'Orkney', 'United Kingdom', 'OC1X 6QE', 'NU16REG']

我的代码是这样的:

import csv
file_1 = csv.reader(open('Standard Reg.csv', 'r'), delimiter=',')
file_2 = csv.reader(open('Driver Details.csv', 'r'), delimiter=',')
for row in file_1:
    reg = row[3]
    avgspeed = row[7]
    for row in file_2:
        firstname = row[0]
        lastname = row[1]
        address = row[2]
        city = row[3]
        region = row[4]
        reg2 = row[7]
if reg  == reg2:
    print('Match found')
else:
    print('No match found')

这是一项正在进行中的工作,但我似乎无法让代码仅比较最后一行。

在这行后面加上print(reg)reg2 = row[7]

它表明它已经阅读了整列。当我在print(reg2)之后:reg2 = row[7]

但是if reg == reg2: 它只读取两列的最后一行并比较它们,我不知道如何解决这个问题。

提前谢谢你。

【问题讨论】:

    标签: python csv


    【解决方案1】:

    我建议您首先将Driver Details.csv 中的所有详细信息加载到字典中,使用注册号作为键。这样您就可以轻松地查找给定的条目,而无需再次读取文件中的所有行:

    import csv
    
    driver_details = {}
    
    with open('Driver Details.csv') as f_driver_details:
        csv_driver_details = csv.reader(f_driver_details)
        header = next(csv_driver_details)       # skip the header
    
        for row in csv_driver_details:
            driver_details[row[7]] = row
    
    with open('Standard Reg.csv') as f_standard_reg:
        csv_standard_reg = csv.reader(f_standard_reg)
        header = next(csv_standard_reg)     # skip the header
    
        for row in csv_standard_reg:
            try:
                driver = driver_details[row[3]]
                print('Match found - {} {}'.format(driver[0], driver[1]))
            except KeyError as e:
                print('No match found')
    

    您所拥有的代码将遍历file_2 并将文件指针留在末尾(如果未找到匹配项)或匹配项的位置(可能在下一个条目之前缺少匹配项)。对于您的工作方法,您必须从每个循环的开头开始读取文件,这会非常慢。


    要添加输出 csv 并显示完整地址,您可以执行以下操作:

    import csv
    
    speed = 74.3
    fine = 35
    
    driver_details = {}
    
    with open('Driver Details.csv') as f_driver_details:
        csv_driver_details = csv.reader(f_driver_details)
        header = next(csv_driver_details)       # skip the header
    
        for row in csv_driver_details:
            driver_details[row[7]] = row
    
    with open('Standard Reg.csv') as f_standard_reg, open('Output log.csv', 'w', newline='') as f_output:
        csv_standard_reg = csv.reader(f_standard_reg)
        header = next(csv_standard_reg)     # skip the header
        csv_output = csv.writer(f_output)
    
        for row in csv_standard_reg:
            try:
                driver = driver_details[row[3]]
                print('Match found - Fine {}, Speed {}\n{} {}\n{}'.format(fine, speed, driver[0], driver[1], '\n'.join(driver[2:7])))
                csv_output.writerow(driver[0:7] + [speed, fine])
            except KeyError as e:
                print('No match found')
    

    这将打印以下内容:

    Match found - Fine 35, Speed 74.3
    Violet Kirby
    585-4073 Convallis Street
    Balfour
    Orkney
    United Kingdom
    OC1X 6QE
    

    并生成一个包含以下内容的输出文件:

    Violet,Kirby,585-4073 Convallis Street,Balfour,Orkney,United Kingdom,OC1X 6QE,74.3,35
    

    【讨论】:

    • 感谢您的帮助,但有些部分我不明白 1 是标题及其作用,倒数第二行显示“,e”,因为它在那里引发语法错误但可以工作没有
    • header = 行用于单独读取标题,如果您print(header) 将看到其内容。
    • 我已经更改了except 行,所以你可以再试一次。
    • 感谢您的快速响应,我需要注释这些行,但我在将完整地址以及 reg 和 speed 输出到 csv 文件中并在带有地址的 shell 中打印罚款时遇到了一些困难它会的。对不起,我对 python 很陌生。
    【解决方案2】:

    测试条件if reg == reg2 出现在两个循环之外(对于file_1 和对于file_2)。这就是为什么只对每个文件的最后一行进行测试的原因。

    另一个问题是您在两个for 循环中使用相同的循环变量row

    【讨论】:

    • 我将 for row in file_2 重命名为 for row2 in file_2 我然后将 if 和 else 缩进到一个循环中,然后在第一个缩进中它只是重复在第二个缩进中没有找到匹配项它重复了很多次(可能是 103 次,因为驱动程序详细信息在 reg 中有 101 行,而标准有 2 行)并且没有找到匹配项
    【解决方案3】:

    尝试csv.DictReader 删除大部分代码行:

    import csv
    Violations = defaultdict(list)
    
    # Read in the violations, there are probably less violations than drivers (I hope!)
    with open('Standard reg.csv') as violations:
        for v in csv.DictReader(violations):
            Violations[v['Reg Plate']] = v
    
    with open('Driver Details.csv') as drivers:
        for d in csv.DictReader(drivers):
            fullname = "{driver.FirstName} {driver.LastName}".format(driver=d)
            if d['Registration'] in Violations:
                count = len(Violations[d['Registration']])
                print("{fullname} has {count} violations.".format(fullname=fullname, count=count))
            else:
                print("{fullname} is too fast to catch!".format(fullname=fullname))
    

    【讨论】:

    • 我不会大写Violations,因为它是一个实例而不是类名。
    猜你喜欢
    • 1970-01-01
    • 2015-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-24
    • 1970-01-01
    相关资源
    最近更新 更多