2017-02-14 7 views
2

외국어 텍스트에서 초과 된 공백을 제거하는 스크립트를 작성했습니다. Windows 명령 프롬프트에서 스크립트를 실행하면 오류가 발생하지 않습니다. 모든 것이 완벽 해 보입니다. 그러나 스크립트에서 지정한 출력 파일이 작성되지 않았거나 입력 파일이 수정되지 않았습니다. 나는 쓸 텍스트 파일 'corpus_1'을 작성하려고 시도했다. 그런 다음 입력 파일로 다시 쓰려고했습니다. 어느 쪽이든, 지정된 파일은 수정되지 않은 상태로 유지됩니다. 내 스크립트를 파일에 쓰게하려면 어떻게합니까? 내 코드에서 무엇을 놓치고 있습니까?내 스크립트가 파일에 쓰지 않는 이유는 무엇입니까?

def lettersWhitespace(): 

    replacements = {' ':' ', 'c ':'c'} 

    with open('C:\\Users\\Charles\\corpus.odt','w+') as infile, open('C:\\Users\\Charles\\corpus_1.odt', 'w') as outfile: 
     for line in infile: 
      for src, target in replacements.iteritems(): 
       line = line.replace(src, target) 
      outfile.write(line) 

편집 : 나는 그 문제를 발견했다고 생각한다. 내 첫 줄 'def lettersWhitespace() :'가 중복 된 것처럼 보입니다. 작성된 것처럼 스크립트는 함수를 정의하지만 해당 함수를 호출하지는 않습니다. 이 소리가 맞습니까?

+0

'w +'는 파일을 지 웁니다. 나는 그것이 당신의 유일한 사본이 아니기를 바랍니다. – user2357112

+0

입력 해 주셔서 감사합니다. 몇 가지 백업이 있지만 스크립트를 실행 한 후에 파일을 지우지 않고 있습니다. 아무것도 수정되지 않습니다. 그러나 마침내 이것이 작동하게되면 'w +'보다는 'w'가 있어야합니까? –

답변

1

ww+ 모두 파일을 자릅니다. 당신이 w+에서 열 경우

with open('testfile.txt', 'r') as f: 
    print(f.read()) 
# a 
# b 
# c 

: 파일을 읽을 수

with open('testfile.txt', 'w') as f: 
    f.write('a\nb\nc') 

당신은 r에서 열 : 당신이 (줄 바꿈 각) a, b, c을 포함하는 파일이 있다고 가정 모드가 잘 렸습니다 (비어 있음).

"잘림없는"읽기/쓰기 모드 별 파일의 시작 부분에 팅 : r+ (또는 파일의 끝으로 파일 핸들을 원하는 경우 : a+)

with open('testfile.txt', 'r+') as outp, open('testfile.txt', 'r') as inp: 
    for line in inp: 
     line = line.replace('a', 'b') 
     outp.write(line) 

파일을 수정 당신이 쓰는 같이

with open('testfile.txt', 'r') as f: 
    print(f.read()) 
# b 
# b 
# c 

파일 모드에 대한 매우 편리한 요약은 this StackOverflow answer of @And에서 찾을 수 있습니다.

+0

감사합니다. 나는 초보자이며 '쓰기', '읽기', '추가'및 '읽기'와 '읽기'로 'w'를 이해했습니다. 그림이 조금 더있는 것처럼 보이기 시작 했으므로 이제 파일 열기 명령에 대한 자습서를 더 살펴볼 것입니다. 문제의 스크립트에서 실제로 원본 텍스트가 변경되지 않는 것 같습니다. 파이썬이 .txt 파일에없는 텍스트로 작업하는 데 어려움이 있는지 궁금합니다. (현재 입력과 출력으로 .odt 파일을 사용하고 있습니다.) –

+0

@CharlesR Windows에서는 바이너리와 원시 데이터 파일간에 차이가 있으므로'b' 모드로 파일을 열어야 할 수도 있습니다 (' b'는'rb +'와 같은 모드에있을 것입니다.'.odt' 파일이 바이너리 파일인지 확실치 않습니다. 조금 혼란 스러워요. 작동 했나요?이 anser가 당신의 질문에 완전히 대답한다면, 잊지 마시기 바랍니다. [accept it] (http://stackoverflow.com/help/accepted-answer). – MSeifert

+0

아직 작동하지 않는 방법을 찾지 못했습니다. 이제 막 모드를 rb +로 변경해 보았습니다. 테스트 용 .txt 파일 또한 중첩 된 'for'문을 주석 처리하고 print()로 출력 메서드를 변경해 보았습니다. 그러나 셸이 쿼리를 수락하고 나에게 새로운 명령을 제공한다는 것 외에는 아무 일도 일어나지 않습니다. 선. 데프 lettersWhitespace() : INFILE과 같은 : INFILE 라인에 대한 : 인쇄 (: 개방 ('RB +' '\\ 사용자 \\ 찰스 \\ TEST.TXT C')과 함께 여기 내 가장 최근의 시험이다 line) –