2009-11-06 1 views
5

PML (Palm Markup Language) 파일을 수정하려고 할 때 MakeBook에 불평을 유발하는 비 ASCII 문자가 내 테스트 파일에있는 것처럼 나타납니다. 해결책은 PML의 모든 비 ASCII 문자를 제거하는 것입니다.파이썬을 사용하여 확장 된 ascii를 제거하는 방법은 무엇입니까?

그래서 파이썬에서이 문제를 해결하려고 시도에서, 나는 그러나

import unicodedata, fileinput 

for line in fileinput.input(): 
    print unicodedata.normalize('NFKD', line).encode('ascii','ignore') 

을 가지고,이 라인은 "유니 코드 STR,하지"여야한다는 오류가 발생합니다. 여기에 파일 조각이 있습니다.

\B1a\B \tintense, disordered and often destructive rage†.†.†.\t 

이 시점에서 제대로 처리하려면 줄을 제대로 전달하는 방법이 확실하지 않습니다.

+0

당신이 누구의 ASCII 값이 255보다 큰 모든 문자를 필터링 하시겠습니까? –

+0

엄밀히 말하면, 확장 ASCII와 같은 것은 없습니다. ASCII는 0에서 127 사이의 값을 정의합니다. 그보다 높은 값은 임의로 해석 할 수 있습니다. 아마도 * 비 ASCII 문자 *라는 용어를 사용해야합니다. – dreamlax

+0

관련 : 터미널 출력을위한 안전 이스케이프 기능 http://stackoverflow.com/questions/437476/safe-escape-function-for-terminal-output – jfs

답변

0

파이썬에서 파일을 읽을 때 파이썬 2.x 및 이전 버전에서 바이트 문자열, 일명 "str"을 얻습니다. 이것을 decode 메소드를 사용하여 "유니 코드"유형으로 변환해야합니다. 예 :

line = line.decode('latin1') 

'latin1'을 올바른 인코딩으로 바꿉니다.

5

시도해보십시오. print line.decode('iso-8859-1').encode('ascii', 'ignore') - 원하는 내용에 훨씬 가깝습니다. 사실이 아닌 것을

line.decode('ascii')

이 데이터에 대한 오류를 발생합니다 : 대답은 아스키 코덱을 사용하여 텍스트를 디코딩 그래서

+0

이것은 MakeBook이 현재 불법 제어 코드에 대해 불평하고 있지만 작동하는 것으로 보입니다. –

+0

@ Jauder, 물론 위의'clean = ''다음에 예를 들어 제어 코드를 제거 할 수 있습니다.(개행 및 캐리지 리턴을 포함한 모든 제어 코드를 제거합니다. 취향에 맞게 조정하십시오. 원하는 제어 코드를 모르면 실제로 할 수 없습니다. 풀다!-). –

+0

@Alex, 내가 알았다면 =). 문제는 난 단지 소스를 사용하지 않고 Java prog로만 작업하고있어 의심스러운 오류 메시지 만 표시된다는 것입니다. http://gist.github.com/227882 –

5

당신은 ASCII로 인코딩 된 데이터로 line를 치료하고 싶습니다 ASCII 인코딩 됨. 다음은 이러한 오류를 무시하는 방법입니다.

line.decode('ascii', 'ignore').

이렇게하면 텍스트가 unicode 인스턴스 형태로 나타납니다.

line.decode('ascii', 'ignore').encode('ascii')

2

드롭하려면 : 당신이 아니라 오히려 텍스트보다 (ASCII 인코딩) 데이터로 작업 할 경우, 그것은 str 또는 bytes 인스턴스를 다시 얻기 위해 다시 인코딩 할 수있다 (파이썬의 버전에 따라) 비 ASCII 문자는 line.decode(your_file_encoding).encode('ascii', 'ignore')을 사용합니다. 하지만 아마 당신은 더 나은 그들을 위해 PLM 이스케이프 시퀀스를 사용하십시오 :

import re 

def escape_unicode(m): 
    return '\\U%04x' % ord(m.group()) 

non_ascii = re.compile(u'[\x80-\uFFFF]', re.U) 

line = u'\\B1a\\B \\tintense, disordered and often destructive rage\u2020.\u2020.\u2020.\\t' 
print non_ascii.sub(escape_unicode, line) 

\B1a\B \tintense, disordered and often destructive rage\U2020.\U2020.\U2020.\t를 출력합니다. 정규 표현식으로

삭제 비 ASCII 및 제어 문자 (이 안전하게 탈출 후 사용할 수 있습니다) 너무 쉬운 :

regexp = re.compile('[^\x09\x0A\x0D\x20-\x7F]') 
regexp.sub('', line)