2013-07-13 3 views
0

У меня есть 2 .csv-файла, которые я хочу сравнить и добавить. Предположим, что в файле столбца 1 есть числа 1. У меня есть аналогичный набор чисел в файле столбца 1 2, но в другом порядке и не все. Я хочу найти в файле 1 столбец 1, чтобы узнать, есть ли совпадение с номером в файле столбца 1. Если есть совпадение, я хочу добавить информацию из файла 2 в файл 1, добавив столбцы в согласованное число. Я также избавляюсь от любых пустых строк во входном файле.Сравнение и добавление файлов .csv в Python

Например:

File 1 
Number Name  EmailAddress 
1  Jenny [email protected] 
2  Josh  [email protected] 
3  Tony  [email protected] 
4  Jeff  [email protected] 


File2 
Number Address 
4  123 Walnut St 

1  17 Yerlington Wy 
7  420 St B 


Output File 
Number Name EmailAddress  Address 
4  Jeff [email protected] 123 Walnut St 
1  Jenny [email protected]  17 Yerlington Wy 
7  NO ENTRY 

Вот код, который я до сих пор, что, кажется, делает все, но добавить правильную информацию.

import csv 

f1 = file('inFile.csv', 'rb') 
f2 = file('inFile2', 'rb') 
f3 = file('outFile.csv', 'wb') 

c1 = csv.reader(f1) 
c2 = csv.reader(f2) 
c3 = csv.writer(f3) 

masterlist = [row for row in c2] 
for hosts_row in c1: 
    row = 1 
    found = False 
    for master_row in masterlist: 
     results_row = hosts_row 
     end_row = masterlist 
     if any(hosts_row): 
      if hosts_row[0] == master_row[0]: 
       results_row.append(end_row[row][1]) 
       found = True 
       break 

      if not found: 
       results_row.append('NO ENTRY') 

    if any(hosts_row): 
     c3.writerow(results_row) 

f1.close() 
f2.close() 
f3.close() 
+0

- это столбцы, разделенные пробелом или вкладкой? – Prasath

ответ

0

Прежде всего, вы не имеете разделитель в ваших файлов CSV, мне пришлось переписать их, как это (запятая):

inFile.csv:

Number,Name,EmailAddress 
1,Jenny,[email protected] 
2,Josh,[email protected] 
3,Tony,[email protected] 
4,Jeff,[email protected] 

inFile2 .csv:

Number,Address 
4,123 Walnut St 

1,17 Yerlington Wy 
7,420 St B 

Тогда у вас есть несколько проблем в коде:

  • вам не хватает чек на пустой master_row
  • странно переменная END_ROW делает то, что вы не хотите, и это практически бесполезно, как вы действительно хотите добавить master_row[1]
  • условие not found в неправильном блоке, так что " NO ENTRY»не добавляются несколько раз
  • есть неиспользованные переменная row
  • (только усиление) питон будет закрывать файлы для вас, когда их переменных выходит из области видимости, так что вы можете удалить близко() вызывают

После моего исправления:

import csv 

f1 = file('inFile.csv', 'rb') 
f2 = file('inFile2.csv', 'rb') 
f3 = file('outFile.csv', 'wb') 

c1 = csv.reader(f1) 
c2 = csv.reader(f2) 
c3 = csv.writer(f3) 

masterlist = [row for row in c2] 
for hosts_row in c1: 
    found = False 
    for master_row in masterlist: 
     results_row = hosts_row 
     if hosts_row and master_row: 
      if hosts_row[0] == master_row[0]: 
       results_row.append(master_row[1]) 
       found = True 
       break 

    if not found: 
     results_row.append('NO ENTRY') 

    if any(hosts_row): 
     c3.writerow(results_row) 

выходного файла:

Number,Name,EmailAddress,Address 
1,Jenny,[email protected],17 Yerlington Wy 
2,Josh,[email protected],NO ENTRY 
3,Tony,[email protected],NO ENTRY 
4,Jeff,[email protected],123 Walnut St 

НТН

+0

Благодарим вас за ввод! Я понял, что после публикации было несколько ошибок, поэтому спасибо, что указали на них. Но когда я использую ваш код, по какой-то причине вместо правильных адресов, все адреса выходят как адрес или NO ENTRY. Я получаю только название, а не правильное подразделение. Любое понимание? – jhong

+0

Хм, это странно, это работает для меня (создает «выходной файл», который я вставил). Адрес добавляется в строке 'results_row.append (master_row [1])', поэтому, возможно, попробуйте распечатать «master_row» и «master_row [1]» перед тем, чтобы увидеть, что на самом деле происходит. –

+0

Еще раз спасибо. На самом деле, на этот раз это был сам файл, который был поврежден на моем компьютере! Когда я повторно сохранил файл, все работало отлично. – jhong

0

Другой взять на него (это один производит вывод, который вы подарил, но я полагаю, выход Tomas является то, что вы описали):

import csv 

def read_file(path): 
    with open(path) as fh: 
     data = csv.reader(fh) 
     return [row for row in data if row] 

def match(l1, l2): 
    result = [] 
    for i in l2: 
     match = False 
     for j in l1: 
      if i[0] == j[0]: 
       row = j + i[1:] 
       match = True 
       break 
     if not match: 
      row = [i[0], "NO ENTRY"] 
     result.append(row) 
    return result 

if __name__ == '__main__': 
    l1 = read_file("inFile.csv") 
    l2 = read_file("inFile2") 
    result = match(l1, l2) 
    of = open('outFile.csv', 'w') 
    writer = csv.writer(of) 
    writer.writerows(result) 
    of.close() 

Несколько нот:

Вы должны использовать open вместо file; в файловом режиме b предназначен для двоичных файлов (при открытии в текстовом режиме могут выполняться преобразования строк). Их было больше, но они уже были рассмотрены.

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