2014-12-05 2 views
0

미리 도움을 청하십시오.Python - 하나의 파일에서 데이터 읽기 및 선택적으로 새 파일에 쓰기

저는 파이썬에서 새롭고 한 형식에서 다른 형식으로 파일을 변환하려고합니다. 데이터 라인 뒤에 상단에

fs = open('sample_data.txt','r') 
fnew = open('sample_output.txt','w') 
with fs as f: 
    while True: 
     line = f.readline() 
     if line and line[0]=='#': 
      print(line) 
      fnew.write(line + '\n') 
     else: 
      data=line.split() 
      fnew.write(data[0]) 
     if not line: break 

print('end of program') 
fs.close 
fnew.close 

파일의 기본 형식은 주석 포함 헤더 : 여기

는 내가 가지고있는 코드입니다.

나는 fnew.write (data [0]) 행에 문제가 있습니다. 범위

라인 분할 내가 처음 두를 제거 할의 8 개의 데이터 열을 나눕니다에서리스트 인덱스 :

IndexError : 나는 다음과 같은 오류가 발생합니다. 그래서 궁극적으로, 전체 파일에서 처음 두 열을 뺀 것을 다시 쓰는 것입니다. 몇 가지 더 복잡한 형식을 다시 포맷해야하지만이 단계에서 오류를 이해할 수 있으면 나머지 작업을 수행하는 방법을 알아낼 수 있기를 바랍니다.

-------------- 업데이트

아바넷입니다. 이 오류를 일으키는 개행 문자입니다. 그러나 수표를 추가 할 때 또 다른 문제가 있습니다. 아래 코드를 실행하면 모든 것이 자동 정지됩니다. "if data :"검사를 제거하면 실행되지만 동일한 "색인 범위를 벗어남"오류가 발생합니다.

"if data :"체크가 제거되고, 개행 문자가없는 샘플 데이터 파일과 함께 다음과 같이 실행 해 보았습니다. 그리고 나 역시 멈추었습니다.

이 문제의 원인을 밝힐 수있는 사람이 있습니까?

fs = open('sample_data.txt','r') 
fnew = open('sample_output.txt','w') 
with fs as f: 
    while True: 
     line = f.readline() 
     for line in f: 
      if line[0]=='#': 
       print(line) 
       fnew.write(line + '\n') 
      else: 
       data=line.split() 
       if data: 
        print(data[0]) 
        fnew.write(data[0] + '\n') 

print('end of program') 
fs.close 
fnew.close 

-------------- 업데이트 2

작품 아래에이 코드. 무한 루프 문제를 해명 해 준 바바라에게 감사드립니다. 마지막 문제는 개행이나 헤더 줄이든 데이터의 첫 번째 줄이 무시되고 결과물에 출력되지 않는다는 것입니다.

with open('sample_data.txt','r') as f, open('sample_output.txt','w') as fnew: 
    line = f.readline() 
    for line in f: 
     if line[0]=='#': 
      print(line) 
      fnew.write(line + '\n') 
     else: 
      data=line.split() 
      if data: 
       print(data[0]) 
       fnew.write(data[0] + '\n') 

print('end of program') 
fnew.close() 
+0

봅니다 시도-을 제외하고 블록을 제외한에서 블록 및 인쇄 데이터가 데이터 변수는 – Dinesh

+0

통화 인쇄이 무엇을 볼 수있는 결함에 fwrite를 포장하는 . 무엇이 출력됩니까? –

+0

제쳐두고 .. "fs.readlines() :"에 다음 행을 추가하여 "f :// True :/line = f.readline()"과 같이이 세 줄을 "바꿀 수 있습니다. 그렇게해도 문제는 해결되지 않지만 코드가 더 멋지게 보일 것입니다. –

답변

1

우선 line이 비어 있으면 어떻게됩니까?

결국 if not line: break이됩니다. 그러나 도착하기 전에 먼저 else:으로 가야합니다 (사실이 아니기 때문에 line and line[0]=='#'). 따라서 data = line.split()data = []을 줄 것입니다. 그리고 나서 data[0]IndexError을 발생시킵니다.

그냥 먼저 if not line: break 테스트를 이동 :

말했다되고 그건
while True: 
    line = f.readline() 
    if not line: 
     break 
    elif line[0]=='#': 
     print(line) 
     fnew.write(line + '\n') 
    else: 
     data=line.split() 
     fnew.write(data[0]) 

는, 처음에이를 작성하는 훨씬 쉬운 방법이있다. 파일 위로 반복하면 while 루프가 readline 주위에 하나씩 줄을 긋지 만 EOF가되면 아무 것도 테스트하지 않아도 루프가 자동으로 끝나거나 break이됩니다.

for line in f: 
    if line[0]=='#': 
     print(line) 
     fnew.write(line + '\n') 
    else: 
     data=line.split() 
     fnew.write(data[0]) 

그러나 그냥 빈, 또는 순수 공백 인 경우에 라인 이되지 비어있는 경우 어떻게됩니까? 예를 들어 번으로 ' \n' 번으로 전화하면 어떻게됩니까? 다시, 당신은 빈 목록을 얻습니다. 따라서 가능하다면 다시 같은 문제가 발생할 것입니다. 물론 그럴 경우 break을 원하지 않을 것입니다. 네가하고 싶은 것이 확실하지 않지만 빈 링크를 건너 뛰고 싶다고 가정 해 보겠습니다. 이 라인은 이미 당신이 단지를 추가하는 \n 끝나는 첫 번째 경우에 fnew.write(line + '\n')을 꽤 이상한, 보조 노트로

data=line.split() 
if data: 
    fnew.write(data[0]) 

: 그래서 그냥이 함께 else 블록을 교체 여분의 줄 바꿈이 있지만 다른 경우에는 fnew.write(data[0])인데, data[0]은 개행 문자로 끝나지 않으므로 첫 번째 열을 하나의 거대한 단어로 병합하여 다음 주석이 끝까지 추가됩니다.


새 코드의 문제점은 대신 루프를 readline() 루프로 바꾸고 for line in f: 루프를 사용하면 이 모두입니다.

처음으로 while 루프를 통해 첫 번째 줄을 읽은 다음 파일의 모든 줄을 읽은 다음 끝냅니다. 그런 다음 두 번째로 while 루프를 통과하여 마지막에 남은 내용을 읽은 다음 나머지 0 줄을 모두 읽은 다음 끝냅니다. 그리고 그것은 영원히 계속됩니다. 왜냐하면 결코 breakwhile True:에서 나오지 않기 때문에, 마지막 0 행을 계속해서 끝까지 읽는 것입니다.

업데이트 된 코드에는 몇 가지 다른 문제가 있습니다.

  • fs.close 단지 참조는 실제로 호출하지 않고, 방법을. fs.close()과 같이 통화 할 때 괄호가 필요합니다.
  • 하지만 어쨌든 fs.close()은 원하지 않습니다. 그것의 전체 점 with은 파일을 자동으로 닫는다는 것입니다.
  • fnew에 대해서도 with 문을 사용하고 싶을 것입니다.

그래서 : 당신은 쓰기를 시도하기 전에

with open('sample_data.txt','r') as f, open('sample_output.txt','w') as fnew: 
    for line in f: 
     if line[0]=='#': 
      print(line) 
      fnew.write(line + '\n') 
     else: 
      data=line.split() 
      if data: 
       print(data[0]) 
       fnew.write(data[0] + '\n') 

print('end of program') 
+0

도움에 감사드립니다. 위 코드를 권장하는 변경 사항으로 업데이트했습니다. 어떤 이유로 나는 코드를 실행하려고 할 때 코드가 멈추고 있습니다. – DataCruncher

+0

@DataCruncher : 내가 뭘 잘못했는지 설명하고 업데이트 된 답변을 확인하십시오. – abarnert

+0

무한 루프와 파일 닫기를 명확히 해 주셔서 감사합니다. 맨 위에있는 코드를 업데이트했습니다. 그것은 예상대로 작동하지만 어떤 이유로 파일의 첫 번째 행을 인쇄하지 않습니다. – DataCruncher