2016-09-14 5 views
0

저는 파이썬 초보자이며 한정자없이 공백 만있는 긴 txt 파일을 처리하려고합니다. 첫 번째 열에 따라 정렬하고 싶습니다.첫 번째 열에 따라 입력 파일을 정렬합니다. 단락 기호는 없지만 공백을 사용합니다.

코드는 정상적으로 컴파일되지만 번호 열 자체의 값이 아니라 첫 번째 열의 첫 번째 값에 따라 출력 파일 만 정렬됩니다. 나는 또한 성공없이 itemgetter 연산자를 시도했다.

나는 이것을 지금 몇 시간 동안 시험해 본 사람이 누구든지 나를 도울 수 있기를 바랍니다. 왜 줄 바꿈 기능이 원하는 효과를 내지 못합니까?

f = open("traj_nvt_20000000.txt","r+") 
lines = f.readlines() for line in f.readlines(): 
line = line.strip() 
parts = line.split(" ") 
lines = sorted(lines, key=lambda line: line[0]) 
with open('test123.txt', 'w') as text: 
    text.writelines(lines) 

I 정렬 할 텍스트 파일 테이블의 발췌 :

54 2 -9.5377 -4.02842 -7.51558 7 
55 2 -9.6834 -4.88656 -7.29358 7 
459 2 -8.76522 -8.30942 -10.144 58 
50 1 -9.33774 -4.46175 -7.24097 7 
56 2 -8.84618 -4.59922 -7.44773 7 
462 2 -10.3377 -9.37008 -10.2265 58 
460 2 -8.59323 -8.64832 -9.32914 58 
457 1 -8.96511 -8.38283 -9.63619 58 
461 2 -9.0727 -7.89321 -9.40869 58 
369 1 -5.93643 -6.20083 -7.56102 47 
504 2 -7.94033 -2.66938 -10.3925 63 
371 2 -6.24752 -6.57434 -7.3023 47 

도움이 아주 많이 감사합니다.

답변

1

당신은 숫자 영숫자하지 정렬 때문에 (그들은 모두 정수라면 잘 모르겠어요, 제가 모든 데이터가없는) 정수 또는 부동 당신의 문자열을 변환 할 수 있습니다

lines = sorted(lines, key=lambda line: float(line[0])) 

하지만 처음 값이 동일한 경우, 나머지는 차별을 사용할 수 있도록 수레의 튜플을 반환하여 모든 값을 정렬하는 것이 더 나은 것 :

lines = sorted(lines, key=lambda line: [float(x) for x in line]) 

BTW 샘플 코드가 올바르지 않습니다 (거기 readlines의 혼합은 시작에 worl하지 않습니다 & 루프 케이).

f = open(r"U:\test.txt","r") # sample file in the question 
lines=[] 
for line in f: 
    lines.append(line.strip().split(" ")) 
f.close() 

lines.sort(key=lambda line: [float(x) for x in line]) 
for l in lines: 
    print(",".join(l)) 

결과 : 당신의 라인을 분리 할 필요가 같은

50,1,-9.33774,-4.46175,-7.24097,7 
54,2,-9.5377,-4.02842,-7.51558,7 
55,2,-9.6834,-4.88656,-7.29358,7 
56,2,-8.84618,-4.59922,-7.44773,7 
369,1,-5.93643,-6.20083,-7.56102,47 
371,2,-6.24752,-6.57434,-7.3023,47 
457,1,-8.96511,-8.38283,-9.63619,58 
459,2,-8.76522,-8.30942,-10.144,58 
460,2,-8.59323,-8.64832,-9.32914,58 
461,2,-9.0727,-7.89321,-9.40869,58 
462,2,-10.3377,-9.37008,-10.2265,58 
504,2,-7.94033,-2.66938,-10.3925,63 
+0

이 보인다'''라인 [0]'''처음 * 열을 참조하는 * 여기에 작동하는 작은 테스트입니다 첫 번째 문자보다는 오히려. – wwii

+0

'line [0]'은 이미 첫 번째 열입니다. (내 재생기를 확인하십시오, OP 코드는 약간입니다 ... 퍼지 말입니다. 아이디어는 나오지만 작동하지 않습니다.) –

+0

편집 내용이 정확합니다. culpa. – wwii