2013-03-27 57 views
0

我被鼓勵離開我的舒適區,並且使用python,但幾乎沒有經驗,現在我卡住了。我試圖比較兩個CSV文件(fileA.csv和fileB.csv),並將所有缺少的用戶行添加到fileB.csv的fileA.csv中。我可以比較的唯一字段是用戶的姓和名(在這種情況下,它是來自每個文件的行[0]和行[2])。根據兩列中的特定數據比較兩個CSV文件

從我的理解,你不能將信息追加到你目前已經打開的文件,所以我打開建議,而不必創建第三個文件(如果可能)。下面有我在正確的軌道上,但有很多數據,所以我需要一個循環。請幫忙。

import csv 
reader1 = csv.reader(open('fileA', 'rb'), delimiter=',', quotechar='|') 
row1 = reader1.next() 
reader2 = csv.reader(open('fileB', 'rb'), delimiter=',', quotechar='|') 
row2 = reader2.next() 


##For Loop... 

     if (row1[0] == row2[0]) and (row1[2] == row2[2]): 
       ## Compare next 
     else: 
       ## Append entire row to fileA.csv 

例FileA.csv:

John,Thomas,Doe,some,other,stuff 
Jane, ,Smith,some,other,stuff 

例FileB.csv:

John, ,Doe,other,personal,data 
Jane,Elizabeth,Smith,other,personal,data 
Robin,T,Williams,other,personal,data 

應從FILEB追加到FILEA唯一的行知更鳥的完整的行,這樣FileA看起來像:

DesiredR esult_FileA:

John,Thomas,Doe,some,other,stuff 
Jane, ,Smith,some,other,stuff 
Robin,T,Williams,other,personal,data 

回答

1

將在文件A中找到的信息先存儲在一個存儲器中。

然後,重新打開追加模式文件A,並遍歷文件B.從乙任何名稱不在集合中發現的,可以隨後被添加到文件一個:

csv_dialect = dict(delimiter=',', quotechar='|') 
names = set() 
with open('fileA', 'rb') as file_a: 
    reader1 = csv.reader(file_a, **csv_dialect) 
    next(reader1) 
    for row in reader1: 
     names.add((row[0], row[2])) 

# `names` is now a set of all names (taken from columns 0 and 2) found in file A. 

with open('fileA', 'ab') as file_a, open('fileB', 'rb') as file_b: 
    writer = csv.writer(file_a, **csv_dialect) 
    reader2 = csv.reader(file_b, **csv_dialect) 
    next(reader2) 
    for row in reader2: 
     if (row[0], row[2]) not in names: 
      # This row was not present in file A, add it. 
      writer.writerow(row) 

將合併的with線需要Python 2.7或更高版本。在較早版本的Python,只是窩兩種說法:

with open('fileA', 'ab') as file_a: 
    with open('fileB', 'rb') as file_b: 
     # etc. 
+0

那是語法是否正確? file_a,打開('fileB','rb')作爲file_b: – justin 2013-03-27 10:50:47

+0

@justin:它在Python 2.7中。在早期版本中,只需嵌套兩個(因此將它們分隔開來並縮進一級)。 – 2013-03-27 10:51:05

+0

@DSM:感謝您的糾正。 – 2013-03-27 12:03:37

0

您可以嘗試pandas,可以幫助你處理CSV文件更容易,而且似乎它更易讀:

import pandas as pd 

df1 = pd.read_csv('FileA.csv', header=None) 
df2 = pd.read_csv('FileB.csv', header=None) 


for i in df2.index: 
    # Don't append if that row is existed in FileA 
    if i in df1.index: 
     if df1.ix[i][0] == df2.ix[i][0] and df1.ix[i][2] == df2.ix[i][2]: continue 

    df1 = df1.append(df2.ix[i]) 

df1.to_csv('FileA.csv', index=None, header=None)