2014-01-21 2 views
3

파일에서 데이터를 읽고이를 두 개의 키와 값으로 나누어 사전에 저장해야하는 파이썬 함수가 있습니다. 예 : 파일 :파이썬 분할 기능. 너무 많은 값을 풀기 오류

http://google.com 2 
http://python.org 3 
# and so on a lot of data 

나는 그것을 위해 분할 기능을 사용하지만 경우 많은 데이터가 정말 거기는 값 오류를 제기

ValueError: too many values to unpack 

나는 이것에 대해 무엇을 할 수 있습니까?

이 당신이 두 변수의 분할 목록을 풀다하려고

with open(urls_file_path, "r") as f: 
    for line in f.readlines(): 
     url, count = line.split()# fails here 
     url_dict[url] = int(count) 
+5

이 오류가 발생한 정확한 코드 줄을 표시 할 수 있습니까? – thefourtheye

+0

잘못된 것이 있습니다. (죄송 합니다만, 당신이하는 일을 보지 않고 더 나은 대답을 드릴 수는 없습니다.) – glglgl

+3

이것은 입력 문자열에 둘 이상의 공백이있을 때 대소 문자를 처리하지 않는다는 것을 의미합니다. – gravetii

답변

14

실패 정확한 코드입니다.

url, count = line.split() 

공백이 없거나 둘 이상의 공백이 있으면 어떻게됩니까? 나머지 단어들은 어디로 갈 것인가?

$ python Test.py 
Read Data: http://google.com 2 
Read Data: http://python.org 3 
Traceback (most recent call last): 
    File "Test.py", line 6, in <module> 
    .format(idx, line.rstrip(), len(split_list) - 1)) 
ValueError: Line 3: 'http://python.org 4 Welcome' has 2 spaces, expected 1 

@abarnert's comment에 따라

http://google.com 2 
http://python.org 3 
http://python.org 4 Welcome 
http://python.org 5 

이 프로그램은 생산, 당신은 실제로 입력 파일로

with open(urls_file_path, "r") as f: 
    for idx, line in enumerate(f, 1): 
     split_list = line.split() 
     if len(split_list) != 2: 
      raise ValueError("Line {}: '{}' has {} spaces, expected 1" 
       .format(idx, line.rstrip(), len(split_list) - 1)) 
     else: 
      url, count = split_list 
      print url, count 

을 할당하기 전에 길이를 확인할 수 있습니다

data = "abcd" 
print data.split() # ['abcd'] 
data = "ab cd" 
print data.split() # ['ab', 'cd'] 
data = "a b c d" 
print data.split() # ['a', 'b', 'c', 'd'] 

, 하나 개 이상의 공간/아니오 공간이있는 경우이

url, _, count = data.partition(" ") 

같은 partition 기능을 사용할 수 있습니다, 다음 count는 각각 문자열이나 빈 문자열의 나머지를 개최한다.

당신은 당신이 rest에 할당됩니다 first 각각 second하고 목록의 나머지 부분에 할당됩니다이

first, second, *rest = data.split() 

먼저 두 값과 같은 작업을 수행 할 수 있습니다, 파이썬 3.x를를 사용하는 경우 , Python 3.x

+1

그는 또한'url, count = line.split (None, 1)'(여분의 공백을'count'에 덤핑함으로써 처리 할 것입니다),'url, _, count = line.partition ('') '(마찬가지로 할 것이지만'count'를 비워 두어 공백을 처리하지 않을 것입니다). 아니면 'a b c d''는 에러로만 계산해야하지만 더 디버깅 가능한 것으로 간주해야하기 때문에이 예외를 잡아 더 관련성이 높은 예외를 다시 잡기를 원할 것입니다. 또는 위의 것 중 하나가 아닐 수도 있습니다. 우리가 가야 할 작은 것을 말해 주면 어렵습니다. – abarnert

+0

@abarnert 감사합니다. :) 대답에'partition' 메소드를 추가하고 지금 'ValueError'를 올렸습니다. – thefourtheye

+1

그는 현재 자신의 파일에서 그런 일이 일어날 수 없다고 생각하므로, 줄 번호와 데이터를 큰 소리로 불평하는 방법을 사용하는 것이 좋을 것입니다. – RemcoGerlich