2017-12-05 3 views
-1

이 기본 코드는 파일을 4 개의 목록으로 분할하려는 것입니다. .txt 파일은 코드 아래에 표시된 것과 같이 형식이 지정되며 각 번호는 공백으로 구분됩니다. 나타나는 오류는 'ValueError : 압축 할 값이 너무 많습니다 (예상 4)'입니다. '압축 해제하는 것만으로는 충분하지 값 (5 예상, 4를 가지고)'이 기다리고 있었다 얼마나 많은 변수를 테스트하기 위해 다음과 같이 압축을 풀 값이 너무 많음 (예상 4)

file = open("myfreefall.txt","r") 
for line in file: 
    if not line.startswith('#'): 
     v,a,t,y= line.split(' ') 


#v a t y 
-0.10 -9.81 0.01 5500.00 
-0.20 -9.81 0.02 5500.00 
-0.29 -9.81 0.03 5500.00 
-0.39 -9.81 0.04 5499.99 
-0.49 -9.81 0.05 5499.99 
-0.59 -9.81 0.06 5499.99 
-0.69 -9.81 0.07 5499.98 
-0.78 -9.81 0.08 5499.97 
... 

그러나 내가 할 코드를 변경하고, 오류가 변경되었습니다. 이것은 코드가 내가 원했던 네 개의 변수를 풀고있는 것처럼 의미가 없습니다! 모든 솔루션/포인터를 많이 주시면 감사하겠습니다. 각 라인 이후

v,a,t,y,test = line.split(' ') 
#  ^^^^ 

분할은 4 개 요소를 반환 할 때 5 값이 존재하지 않는 : 당신이 5이 개 라인에 따라 값을 개봉하고 있기 때문에

file = open("myfreefall.txt","r") 
for line in file: 
    if not line.startswith('#'): 
     v,a,t,y,test= line.split(' ') 
+1

몇 줄을 보려면 line.split()을 인쇄하지 않는 것이 좋을까요? – SuperStew

+0

어떤 라인이 질식합니까? 보려는 줄을 인쇄 해보십시오. – Galen

+1

텍스트 파일의 형식이 일관되게 일관되게 나타나지 않습니다. – Julien

답변

0

두 번째 오류는 정확 , 따라서 오류. 이 방법으로 압축을 풀면 장기적으로 문제가 발생할 수 있습니다. 특히 많은 요소가 문제가 될 수 있습니다. 분할 선의 길이를 명시 적으로 검사하는 것이 좋습니다. 이 공간은 탭 또는 빈 유니 코드 문자 (: http://jkorpela.fi/chars/spaces.html 참조) 중 하나가 될 수 있다는 가능성 즉 -이 자동으로 공백에 분할 이후

원래의 문제를 들어, line.split()를 사용해보십시오.

또는 하나의 텍스트를 구문 분석 단순화 할 수있는 라인에 정규식을 사용할 수

import re 

regex = re.compile('([-+]?[0-9]*\.[0-9]+|[0-9]+)') # regex for floating-point numbers 
matches = regex.findall(line) # `matches` will return a list 
0

댓글이 제안했듯이, 실제로 문제를 일으키는 라인을 볼 수있는 라인을 인쇄 해보십시오 (그러나 확인 line.split 앞에 인쇄물을 넣으십시오).

마지막으로 빈 줄이 줄 바꿈 문자로 읽혀집니다. 가장 쉬운 해결책은 if 문에 다른 조건에 압정 아마 그래서 경우 :

file = open("myfreefall.txt","r") 
for line in file: 
    if not line.startswith('#') and line != '\n': 
    # or, more robust: 
    if not line.startswith('#') and len(line) == 4: 
     v,a,t,y= line.split(' ') 

아니면이 시도/제외와

:

file = open("myfreefall.txt","r") 
for line in file: 
    try: 
     v,a,t,y= line.split(' ') 
    except ValueError: 
     continue 
     # Skip over this line if the extraction fails 

두 번째 경우 문이 더 강력에만 때문에 정확히 네 개의 목록 항목이있는 경우 네 개의 변수를 추출해보십시오. 다른 모든 경우 (추출 할 항목이 더 많거나 적음)는 무시됩니다. 사용자의 요구에 맞게 조정할 수 있습니다 (예 : 더 긴 줄도 읽을 수 있도록하려면 'len (line)> = 4'로 변경하십시오.

솔직히 말해서 try/except 변형에 대한 특별한 이점은 생각할 수 없지만 방금 썼을 때 나는 그 사실을 그대로 두었을 것입니다. 실제로는 너무 강력 할 수도 있습니다. 그 이유는 ValueErrors가 원인이되는 이유는 기타과 너무 작아서 작업 할 수 없기 때문입니다.

설명대로 실패한 두 번째 시도는 완벽합니다. 당신은 파이썬에게 네 개의 엔트리의리스트를 v, a, t, y, test라는 5 개의 변수로 나누라고 말하고 있습니다. 그것이 '5가 예상 4이고'라고 말할 때 오류가 언급 한 것입니다. 코드가 훨씬 빨리 실패하기 때문에 오류 동작이 변경되었을 수 있습니다. 마지막 줄을 제외한 모든 줄에서 작업하기 전에 사용할 목록 항목이 하나뿐입니다. 5 개의 변수를 변경하면 맨 처음 줄에 오류가 발생합니다. 여기서 네 개의 항목이 있지만 이제는 다섯을 묻습니다.

관련 문제