2017-01-12 127 views
0

我想比較兩個csv文件並通過它們進行搜索以查找特定值。下面的例子。Python:比較兩個CSV列表


文件中的一個

名字,姓氏,年齡

約翰,能源部,45

簡,DOE,34

羅伯特,重擊,27

鮑勃,White,56

卡里,伍茲,28


文件中的兩個

羅伯特


腳本應該使用文件中的兩個的名字列在文件中搜索一個人的名字列並返回年齡

結果 羅伯特,27 簡,34

我的代碼只輸出羅伯特,27不繼續尋找簡的第二排。我試着用While循環沒有成功。任何援助將非常感謝!謝謝!

僅供參考,我將通過超過10k行的文件搜索50多個項目。

下面的代碼:

import csv 

FileOne = open('/FileOne') 
FileOneReader = csv.DictReader(FileOne) 

FileTwo = open('/FileTwo') 
FileTwoReader = csv.DictReader(FileTwo) 


for row in FileTwoReader: 
    for row2 in FileOneReader: 
     if row['FirstName'].lower() in row2['FirstName'].lower(): 
      print 'Name:' + row['FirstName'] + ' Age: ' + row2['Age'].lower() 
+1

究其原因,第二個是不是印刷是因爲你正在閱讀在第一次迭代整個'csv.DictReader'對象。你的一個文件被第二次迭代耗盡。您應該將數據保存在列表中並進行檢查。 – Abdou

+0

該CSV文件是可疑的。請參閱[CSV格式的定義](https://tools.ietf.org/html/rfc4180#section-2)。如果row ['FirstName']。lower()== row2 ['FirstName']],那麼只需改變這個'如果row ['FirstName']。row2 ['FirstName']。 .lower():在清理完數據之後。 –

回答

0

的原因,第二個是不印刷是因爲你正在閱讀在第一次迭代整個csv.DictReader對象(這是一個iterator)。通過第二次迭代,您的iterators中的一個已經耗盡,所以它不會返回任何內容。

您應該將數據保存在列表中並執行這種檢查。這裏是一個指南:

# Use with statements whenever you're working with more than one file 
with open('full_names.csv') as fileone, open('first_names.csv') as filetwo: 
    full_table = list(csv.DictReader(fileone)) 
    small_table = list(csv.DictReader(filetwo)) 
    for row1 in full_table: 
     for row2 in small_table: 
      if row2['FirstName'].lower() == row1['FirstName'].lower(): 
       print('Name: ' + row2['FirstName'] + ', Age: '+ row1['Age'].lower()) 

這應該產生:

# Name: Jane, Age: 34 
# Name: Robert, Age: 27 

full_names。CSV包含:

FirstName,LastName,Age 
John,Doe,45 
Jane,Doe,34 
Robert,Smite,27 
Bob,White,56 
Cary,Woods,28 

first_names.csv包含:

FirstName 
Robert 
Jane 
+0

這對我有效,但我不得不將if語句中的'=='更改爲'in'。謝謝! – marksman

1

這是很容易與大熊貓!

用pandas導入兩個csv文件,將第二個csv與第一個csv合併,然後選擇所需的變量。

import pandas as pd 
df1 = pd.DataFrame([['A', 'LastA', 30], ['B', 'LastB', 20], ['C', 'LastB', 10]], 
        columns=['FirstName', 'LastName', 'Age']) 
df2 = pd.DataFrame([['A'], ['B']], 
        columns=['FirstName']) 

df2.merge(df1, on='FirstName')[['FirstName', 'Age']] 

## -- End pasted text -- 
Out[7]: 
    FirstName Age 
0   A 30 
1   B 20 
+0

謝謝你的建議。我會更多地瞭解熊貓。 – marksman

0

Mayeb這樣的事嗎?

import csv 

FileOne = open('/FileOne') 
FileOneReader = csv.DictReader(FileOne) 

FileTwo = open('/FileTwo') 
FileTwoReader = csv.DictReader(FileTwo) 

names_to_check = [] 

for row in FileTwoReader: 
    names_to_check.append(row['FirstName'].lower()) 

for row in FileOneReader: 
    if row['FirstName'].lower() in names_to_check: 
     print "Name: {} Age: {}".format(row['FirstName'], row['Age']) 
+1

感謝您的幫助! – marksman