2017-03-14 13 views
0

두 개의 .txt 파일을 비교하려고합니다. 첫 번째 파일은 탭으로 구분 된 세 개의 값 (예 : '상품 번호' '응답'및 '코드')이있는 '키'입니다. 두 번째 파일에는 탭으로 구분 된 두 개의 값이 들어 있습니다 ("항목 번호"및 "응답"). 첫 번째 파일을 검색하고 두 번째 파일과 일치하는 "항목 번호/응답"쌍을 찾은 다음 올바른 "코드"를 출력하는 프로그램이 필요합니다. 일치하는 항목이 없으면 출력을 공백 ("")으로 지정합니다. 나는 프로그래머가 아니지만 이것을 알아 내면 직장에서 특정 업무에 소비하는 시간을 크게 줄일 수 있습니다.ValueError : 압축 할 값이 너무 많음 (터플 키가있는 dict 사용 중)

내 코드 설정에 도움이 될 thread이 발견되었습니다. 나는 같은 것을 성취하고 싶다.

f1 = open("Key.txt") 
f2 = open("Uncoded.txt")  
d = {} 

while True: 
    line = f1.readline() 
    if not line: 
     break 
    c0,c1,c2 = line.split('\t') 
    d[(c0,c1)] = (c0,c1,c2) 
while True: 
    line = f2.readline() 
    if not line: 
     break 
    c0,c1 = line.split('\t') 
    if (c0,c1) in d: 
     vals = d[(c0,c1)] 
     print (c0, c1, vals[1]) 

f1.close() 
f2.close() 

내가 탭 라인을 분리하는 ('\의 t')을 시도 할 경우, 나는 ValueError를 얻을 : 너무 많은 값이 줄을 풀고 아래

file 1, "Key.txt": 
1 dog C 
2 cat C 
3 bird C 
4 pig C 
5 horse C 
1 cat Sem 
2 bat TA 
3 animal Super 
4 panda M 
5 pencil U 

file2, "Uncoded.txt": 
4 pig 
3 animal 
5 bird 
2 bat 
2 cat 
0 
1 fluffy 
0 dog 
1 

desired output: 
4 pig C 
3 animal Super 
5 bird  
2 bat TA 
2 cat C 
0  
1 fluffy  
0 dog  
1  

는 내가 가지고있는 코드입니다 "c0, c1, c2 = line.split ('\ t')"

통찰력이나 도움을 많이 주셔서 감사합니다!

+1

(예를 들어 결국) 빈 라인이 발견되지 않을 수 있지만,'split'은 빈 목록을 반환있을 경우 :. 압축 해제 후, 잘 분할 압축을 풀고 목록의 길이를 확인하지 않습니다이 –

+0

당신은 다른 수의 항목을 가진 줄을 가지고 있지만, 당신은 변수의 수와 같지 않은'c0, c1, c2' 변수의 수를 얻었습니다. 오류가 발생했습니다. – Hoopdady

+0

사전 및 튜플 이외의 다른 문제를 해결할 것을 권장합니까? –

답변

0

문제는 파일 중 하나에있는 줄 중 하나에 예상 한 항목 수가 없다는 것입니다. 가능한 원인은 추가 줄 바꿈 (아마도 파일의 끝에)입니다. 파이썬은 마지막으로 라인 이후에 개행 문자 만있는 라인으로 보게 될 것입니다. 빈 줄을 세 부분으로 나눌 수 없으면 논리가 실패합니다.

이 문제를 해결하는 한 가지 방법은 값을 압축 해제하지 않고 단일 변수로 분할하는 것입니다. 그럼 당신은 분할 얼마나 많은 항목을 확인할 수 있으며, 단지 그것을 예상 금액 인 경우 개봉과 함께 계속 :

while True: 
    line = f1.readline() 
    if not line: 
     break 
    vals = line.split('\t') # don't unpack immediately 
    if len(val) == 3:  # check you got the expected number of items 
     c0, c1, c2 = vals # unpack only if it will work 
     d[(c0,c1)] = (c0,c1,c2) 
    else: 
     print("got unexpected number of values: {}".format(vals) # if not, report the error 

그것은 당신의 오류와 관련이없는,하지만 당신이 원하는 경우에 당신은 당신의 루프 상당히 단순화 할 수 있습니다 루프 while 루프 대신 for 루프를 사용하여. 파일 객체는 반복 가능하므로 파일의 행을 생성합니다 (마치 readline()에서 가져온 것과 같습니다.) 가장 좋은 점은 파일의 끝 부분을 직접 찾지 않아도되고 파일이 다 소모되면 반복이 끝나는 것입니다 :

for line in f1: # this does the same thing as the first four lines in the code above 
    ... 
+0

통찰력에 감사드립니다. 나는 단순화 된'for' 루프를 사용했고 파이썬이 텍스트 파일을 그들이 설정 한 방식으로 읽도록 도와주는 코드를 작성했다. 지금 일하고있어! 정말 고마워! –