2017-03-17 8 views
1

두 개의 텍스트 파일이 있습니다. a.txt이,이 같은 선 (백만 라인)이 있습니다 :python은 두 개의 큰 목록을 비교하고 하나를 처리합니다.

991000000019999998,b10000021, 
991000000019703408,b10000021, 
991000545455435408,b10000045, 
991000000029703408,b10000045, 
... 

첫 번째 부분은 바코드 (991000000019703408)이고, 두 번째 부분은 bib_number (b10000021)입니다. bib_number는 각 줄마다 중복 될 수 있습니다. 그러나 바코드는 고유합니다. 그래서 Set()를 사용하면 괜찮지 않다고 생각합니다. 다른 파일 b.txt에서 의 정보 만 bib_number에 대한 (600,000 기록) : (b10000045 같은) eachline의 bib_number이 아닌 경우

b10000021 
b10000045 
b10000215 
... 

지금 내가 a.txt이에, 두 개의 파일을 비교해야 b.txt,이 전체 라인은 (991000000029703408, b10000045)

과 같은 코드를 작성하지만 20 분이 지나야 만 c.txt에 출력해야합니다.

with open("a.txt", "r") as f1,open("b.txt", "r") as f2,open("c.txt","w") as f3: 
    total_bb=f1.readlines() 
    list_match=f2.readlines() 
    for item_bb in total_bb: 
     recordList=re.split(",",item_bb) 
     item_bb_w=(recordList[1])+'\n' 
     if item_bb_w not in list_match: 
      f3.write(item_bb) 

두 가지 큰 목록을 비교하는 데 필요한 트릭이 있습니까? set의 사용 덕분에

+0

주문 하시겠습니까? 그냥 set과 set1 - set2로 바꾸지 않으면 모든 누락 된 숫자를 얻을 수 있습니다. – AChampion

답변

1

, 조회 O(1)입니다 :

with open("a.txt", "r") as f1,open("b.txt", "r") as f2,open("c.txt","w") as f3: 
    bs = set(b.strip() for b in f2) 
    for a in f1: 
     x = a.split(',') 
     if x[1].strip() not in bs: 
      f3.write(a) 

나는 또한 쉼표로 구분 된 값을 읽기위한 csv 모듈에 보일 것이다.

+0

bib_number는 각 행에서 중복 될 수 있습니다. 그러나 바코드는 고유합니다. (편집했습니다.) 그래서 Set()을 사용하면 괜찮지 않다고 생각합니다. SET()은 동일한 요소를 제거합니다. 그리고 bib_number뿐만 아니라 전체 라인을 출력해야합니다. 감사합니다. –

+0

'a' 전체를 작성하도록 업데이트되었습니다. – AChampion

+1

@ AChampion은 x [1] .strip()이 b가 아닐 때 should "x [1] .strip()이 bs에없는 경우"? – plasmon360