2017-01-12 1 views
0

두 CSV 파일을 비교하고 특정 값을 찾기 위해 검색하려고합니다. 아래 예.Python : 두 CSV 목록 비교


FILE ONE

이름, 성, 나이

존, 미상, 45

제인, 미상, 34

로버트, 성스러운 일격, 27

밥 , 화이트, 56

,

캐리, 우즈, 28


FILE 두

FIRSTNAME

로버트

제인


스크립트 파일에서 검색하는 파일 두의 FIRSTNAME 열을 사용한다

는 하나의 이름 열 및 나이 반환 내 코드는 로버트를 출력 34

결과 로버트, 27 제인, (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

이유입니다. 두 번째 반복에서 파일 중 하나가 모두 소진됩니다. 목록에 데이터를 저장하고 그런 식으로 확인해야합니다. – Abdou

+0

CSV 파일이 용의성이 있습니다. [CSV 형식 정의] (https://tools.ietf.org/html/rfc4180#section-2)를 참조하십시오. row2 [ 'FirstName']. lower() :'이 경우'row [ 'FirstName']. lower() == row2 [ 'FirstName']의 경우이 행을 ' .lower() :'데이터를 정리 한 직후. –

답변

0

두 번째 인쇄없는 이유입니다. 두 번째 반복에 따라 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에는 다음이 포함됩니다 첫 번째 반복에서 전체`csv.DictReader` 객체를 읽기 때문에 두 번째는 인쇄되지 않습니다

FirstName 
Robert 
Jane 
+0

이것은 나를 위해 일했지만 if 문에서 '=='를 'in'으로 변경해야했습니다. 감사! – marksman

1

이 팬더 매우 쉽습니다!

팬더로 두 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

첫 번째 반복에서 (AN iterator입니다) 전체 csv.DictReader 개체를 읽기 때문에

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