2013-08-06 2 views
0

텍스트 파일의 두 줄과 두 줄을 짝으로하여 사전에 키 - 값 쌍을 추가하려고합니다. 왜 이것이 작동하지 않습니까?Python : 압축 할 값이 너무 많음 (사전)

newdata = {} 
os.chdir("//GOLLUM//tbg2//tbg2//forritGB") 
f = open(filename) 
for line1, line2 in f.readlines(): 
    newdata[line1] = line2 

편집 : 내가 오류가

ValueError: too many values to unpack 

답변

0

당신은 모든 라인을 읽기, 두 변수에 첫 번째 줄 (시퀀스)를 할당하는 것입니다. 첫 번째 행이 2 자로 구성된 경우에만 작동합니다. 대신 반복자의 파일을 사용

여기
newdata = {} 
os.chdir("//GOLLUM//tbg2//tbg2//forritGB") 
with open(filename) as f: 
    for line1 in f: 
     newdata[line1.strip()] = next(f, '').strip() 

next()는 파일에서 다음 행을 읽습니다. (각 행의 끝에 줄 바꿈 포함) 여분의 공백을 제거하기 위해,

from itertools import izip_longest 

def pairwise(iterable): 
    return izip_longest(*([iter(iterable)] * 2), '') 

newdata = {} 
os.chdir("//GOLLUM//tbg2//tbg2//forritGB") 
with open(filename) as f: 
    for line1, line2 in pairwise(f): 
     newdata[line1.strip()] = line2.strip() 

참고 str.strip() 전화 :

대안은 한 쌍의 현명한 조리법을 사용하는 것입니다. 메모리에 전체 파일을 읽을 왜

0
newdata = {} 
os.chdir("//GOLLUM//tbg2//tbg2//forritGB") 
with open(filename) as f: 
    for line1, line2 in zip(*[iter(f)]*2): 
     newdata[line1] = line2 

또는

os.chdir("//GOLLUM//tbg2//tbg2//forritGB") 
with open(filename) as f: 
    newdata = dict(zip(*[iter(f)]*2)) 
+2

? '.readlines()'는 여기 메모리 호그입니다. 그냥'f' * 직접 * 사용하고 버퍼를 사용하여 읽는 줄이 있습니다. –

+0

그렇게 생각하지 않았습니다. 감사! – RussW

관련 문제