파이썬을 사용하여 파일 형식을 유니 코드에서 ASCII로 변환하려면 어떻게합니까?

StackOverflow https://stackoverflow.com/questions/175240

문제

파일을 유니 코드 형식으로 출력하는 타사 도구를 사용합니다. 그러나 나는 그것이 ASCII에있는 것을 선호합니다. 이 도구에는 파일 형식을 변경할 설정이 없습니다.

Python을 사용하여 전체 파일 형식을 변환하는 가장 좋은 방법은 무엇입니까?

도움이 되었습니까?

해결책

파일을 unicode 기능이지만 직선 ASCII와 동등한 유니 코드 문자 문제가 발생합니다.

이 블로그 추천합니다 유니 코드데다 직접 해당 ASCII 값없이 대략 변환 된 문자를 처리하는 모듈, 예를 들어 모듈

>>> title = u"Klüft skräms inför på fédéral électoral große"

일반적으로 변환됩니다

Klft skrms infr p fdral lectoral groe

꽤 잘못되었습니다. 그러나 사용 unicodedata 모듈, 결과는 원본 텍스트에 훨씬 더 가까울 수 있습니다.

>>> import unicodedata
>>> unicodedata.normalize('NFKD', title).encode('ascii','ignore')
'Kluft skrams infor pa federal electoral groe'

다른 팁

나는 이것이 당신이 알고있는 것보다 더 깊은 문제라고 생각합니다. 단순히 유니 코드에서 ASCII로 파일을 변경하는 것은 쉽지만 모든 유니 코드 문자를 합리적인 ASCII (많은 문자 모두에서 사용할 수 없음)로 변환하는 것이 또 다른 것입니다.

이 Python Unicode 자습서는 ASCII로 번역 된 유니 코드 문자열에 어떤 일이 발생하는지에 대한 더 나은 아이디어를 제공 할 수 있습니다. http://www.reportlab.com/i18n/python_unicode_tutorial.html

다음은 사이트에서 유용한 인용문입니다.

Python 1.6도 인코딩을 지정할 수있는 "유니 코드"내장 기능도 가져옵니다.

> >>> unicode('hello') u'hello'
> >>> unicode('hello', 'ascii') u'hello'
> >>> unicode('hello', 'iso-8859-1') u'hello'
> >>>

'hello'의 캐릭터는 세 가지 인코딩 모두에 공통적이기 때문에이 세 가지 모두 같은 것을 반환합니다.

이제 ASCII 외부에있는 유럽 악센트로 무언가를 인코딩합시다. 콘솔에서 보는 것은 운영 체제 로케일에 따라 다를 수 있습니다. Windows를 사용하면 Iso-Latin-1을 입력 할 수 있습니다.

> >>> a = unicode('André','latin-1')
> >>> a u'Andr\202'

급성 문자 e를 입력 할 수 없으면 문자열 'andr 202'를 입력 할 수 있습니다.

유니 코드는 반복 및 분할과 같은 모든 일반적인 작업을 지원합니다. 우리는 여기서 그들을 넘어 가지 않을 것입니다.

그건 그렇고, 이것들은 Linux 명령입니다 iconv 이런 종류의 일을하기 위해.

iconv -f utf8 -t ascii <input.txt >output.txt

다음은 인코딩 번역을 수행 할 간단한 (그리고 어리석은) 코드입니다. 입력 파일이 UTF-16에 있다고 가정합니다 (Windows는 이것을 간단히 '유니 코드'라고합니다).

input_codec = 'UTF-16'
output_codec = 'ASCII'

unicode_file = open('filename')
unicode_data = unicode_file.read().decode(input_codec)
ascii_file = open('new filename', 'w')
ascii_file.write(unicode_data.write(unicode_data.encode(output_codec)))

유니 코드 파일에 ASCII 문자가 아닌 문자가있는 경우에는 작동하지 않습니다. 인식되지 않은 문자를 '?'s로 바꾸기 위해 다음을 수행 할 수 있습니다.

ascii_file.write(unicode_data.write(unicode_data.encode(output_codec, 'replace')))

체크 아웃 문서 더 간단한 선택을 위해. 더 정교한 일을해야한다면 체크 아웃 할 수 있습니다. 유니 코드 망치 파이썬 요리 책에서.

이와 같이:

uc = open(filename).read().decode('utf8')
ascii = uc.decode('ascii')

그러나 이것이 그렇게 될 것임을 주목하십시오 불합격 a UnicodeDecodeError 예외 ASCII로 변환 할 수없는 문자가있는 경우.

편집 : Pete Karl이 방금 지적했듯이 유니 코드에서 ASCII까지 일대일 매핑은 없습니다. 따라서 일부 캐릭터는 단순히 정보 보존 방식으로 변환 할 수 없습니다. 또한 표준 ASCII는 UTF-8의 서브 세트이므로 디코딩을 수행 할 필요조차 없습니다.

ASCII가 아닌 문자를 건너 뛰고 ASCII 출력 만 출력하고 싶었던 문제의 경우 아래 솔루션은 실제로 잘 작동했습니다.

    import unicodedata
    input = open(filename).read().decode('UTF-16')
    output = unicodedata.normalize('NFKD', input).encode('ASCII', 'ignore')

'유니 코드'파일 형식이 없다는 점에 유의해야합니다. 유니 코드는 여러 가지 방법으로 바이트로 인코딩 할 수 있습니다. 가장 일반적으로 UTF-8 또는 UTF-16. 제 3 자 도구가 출력되는 것을 알아야합니다. 그것을 알게되면, 다른 인코딩 사이를 변환하는 것은 매우 쉽습니다.

in_file = open("myfile.txt", "rb")
out_file = open("mynewfile.txt", "wb")

in_byte_string = in_file.read()
unicode_string = bytestring.decode('UTF-16')
out_byte_string = unicode_string.encode('ASCII')

out_file.write(out_byte_string)
out_file.close()

다른 답변에서 언급했듯이, 아마도 인코딩 메소드에 오류 핸들러를 제공하고 싶을 것입니다. 오류 핸들러로서 '대체'를 사용하는 것은 간단하지만 ASCII에서 표현할 수없는 문자가 포함되어 있으면 텍스트를 망칠 것입니다.

다른 포스터가 지적했듯이 ASCII는 유니 코드의 하위 집합입니다.

그러나 당신이 있다면 :

  • 레거시 앱이 있습니다
  • 해당 앱의 코드를 제어하지 않습니다
  • 입력이 ASCII 서브 세트로 떨어질 것이라고 확신합니다

그런 다음 아래 예제는 다음 방법을 보여줍니다.

mystring = u'bar'
type(mystring)
    <type 'unicode'>

myasciistring = (mystring.encode('ASCII'))
type(myasciistring)
    <type 'str'>
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top