2016-02-28 15 views
0

У меня есть два файла csv. Одна из них называется «Standard reg.csv», другой «Драйвер Details.csv»Как сравнить два файла csv в Python

В «Standard reg.csv» первые две строки являются:

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

Первые две строки в драйвере Подробнее .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: он читает только последние строки обеих колонок и сравнивает их, и я не знаю, как это исправить.

Заранее спасибо.

ответ

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 
+0

Благодарим вас за помощь, но некоторые части, которые я не понимаю 1, это заголовок, а что он делает и от 2-й до последней строки, где он говорит «, e», поскольку он выдает синтаксическую ошибку с этим, но работает без – Tilak

+0

. 'Header =' строка используется для чтения заголовка отдельно, если вы напечатаете (заголовок) ', вы увидите его содержимое. –

+0

Я внес изменения в строку 'except', так что вы можете попробовать это снова. –

1

Условие тестирования if reg == reg2 появляется за пределами обеих петель (для файла_1 и для файла_2). Вот почему тестирование выполняется только с последней строкой из каждого файла.

Другая проблема заключается в том, что вы используете одну и ту же переменную цикла row в обоих циклах for.

+0

i переименован для строки в файле_2 для строки2 в файле_2 i thenk отступом if и else в один из циклов, тогда как и в первом отступе, который он только что повторил. Нет совпадения, найденного твизом, а затем во втором он повторил его еще много (возможно 103 раза, потому что информация о драйвере имеет 101 строку в регистре, а стандарт имеет 2), и он не нашел соответствия – Tilak

0

Попробуйте 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)) 
+0

Я бы не использовал «Нарушения», потому что это экземпляр, а не имя класса. – pcurry

Смежные вопросы