2014-10-14 6 views
1

다음과 같은 프로그램을 사용하여 단어 단위로 파일을 읽고 다른 파일에 단어를 쓰지만 첫 번째 파일의 ASCII가 아닌 문자는 쓰지 않습니다. 내가 직면하고파이썬에서 파일을 읽고 비 ASCII 문자를 제거합니다.

import unicodedata 
import codecs 
infile = codecs.open('d.txt','r',encoding='utf-8',errors='ignore') 
outfile = codecs.open('d_parsed.txt','w',encoding='utf-8',errors='ignore') 


for line in infile.readlines(): 
    for word in line.split(): 
     outfile.write(word+" ") 
    outfile.write("\n") 

infile.close() 
outfile.close() 

유일한 문제는이 코드로는 (d_parsed) 두 번째 파일에 새 줄을 인쇄하지 않습니다. 모든 단서 ?? docs for codecs.open에서

+0

뭐가 잘못 됐어. 그것은 완벽하게 작동합니다. – bluefoggy

+0

outfile.write ("\ n")와 같이 줄 바꿈을하지 않습니다. – user1894963

+1

Windows를 사용하고 있고 텍스트 편집기가있는 경우 각 줄 끝에'\ n '이 없어 보일 수 있습니다 파일을 보면'\ n'을 라인 구분 기호로 인식하지 못합니다. – bernie

답변

6

codecs.open()은 보편적 인 개행을 지원하지 않습니다. 예를 들어 Windows에서 읽는 동안 \r\n\n으로 변환하지 않습니다. 대신

사용 io.open() : 당신이 비 ASCII 문자를 제거하려면

#!/usr/bin/env python 
from __future__ import print_function 
import io 

with io.open('d.txt','r',encoding='utf-8',errors='ignore') as infile, \ 
    io.open('d_parsed.txt','w',encoding='ascii',errors='ignore') as outfile: 
    for line in infile: 
     print(*line.split(), file=outfile) 

BTW, 당신은 ascii 대신 utf-8을 사용해야합니다.

#!/usr/bin/env python 
nonascii = bytearray(range(0x80, 0x100)) 
with open('d.txt','rb') as infile, open('d_parsed.txt','wb') as outfile: 
    for line in infile: # b'\n'-separated lines (Linux, OSX, Windows) 
     outfile.write(line.translate(None, nonascii)) 

이 정상화되지 않습니다

입력 인코딩 다음 바이너리 모드로 파일을 열고 비 ASCII 문자를 제거 bytes.translate()를 사용할 수 있습니다 (예 : UTF-8) 아스키와 호환되는 경우

첫번째 코드 예제와 같은 공백.

+0

'bytes.translate()'- 매우 좋음 – Vor

+1

errors = "ignore"=> 진정한 하루 보호기 – router

1

:

참고 : 파일은 항상 더 바이너리 모드를 지정하지 않은 경우에도, 바이너리 모드로 열립니다. 이는 8 비트 값을 사용하는 인코딩으로 인한 데이터 손실을 피하기 위해 수행됩니다. 이것은 읽기와 쓰기에 '\ n'의 자동 변환이 수행되지 않는다는 것을 의미합니다.

실제로는 개행 시퀀스가 ​​'\r\n' 인 Windows를 사용하고 있다고 가정합니다. 텍스트 모드로 열린 파일은 \n에서 \r\n으로 자동 변환되지만, codecs.open에서는 발생하지 않습니다.

"\n" 대신 "\r\n"을 쓰면 Windows에서 정상적으로 작동합니다.