2017-01-12 128 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