Python의 파일에서 문자 읽기
텍스트 파일에는 "나는 이것을 좋아하지 않습니다"라는 문자열이 있습니다.
하지만, 제가 그것을 문자열로 읽었을 때, 그것은 "저는 이렇게 합니다"가 됩니다.\u2018은 ""의 유니코드 표현인 것으로 알고 있습니다.사용합니다
f1 = open (file1, "r")
text = f1.read()
명령을 실행합니다.
자, 문자열을 읽을 때 "나는 이렇게 하지 않아" 대신 "나는 이렇게 하지 않아"라는 식으로 문자열을 읽는 것이 가능할까요?
두 번째 편집:이 문제를 해결하기 위해 매핑을 사용하는 사람들을 본 적이 있지만, 실제로 이러한 종류의 ANSI를 유니코드로(또는 그 반대로) 변환하는 내장 변환은 없습니까?
참조: http://docs.python.org/howto/unicode
따라서 파일에서 유니코드를 읽는 것은 간단합니다.
import codecs
with codecs.open('unicode.rst', encoding='utf-8') as f:
for line in f:
print repr(line)
업데이트 모드에서 파일을 열 수도 있어 읽기와 쓰기가 모두 가능합니다.
with codecs.open('test', encoding='utf-8', mode='w+') as f:
f.write(u'\u4500 blah blah blah\n')
f.seek(0)
print repr(f.readline()[:1])
편집: 저는 당신의 목표가 단지 파이썬에서 파일을 문자열로 올바르게 읽을 수 있는 것이라고 생각합니다.유니코드에서 ASCII 문자열로 변환하려는 경우 유니코드 문자가 ASCII에 존재할 필요가 없기 때문에 직접 변환할 방법이 없습니다.
ASCII 문자열로 변환하려면 다음 중 하나를 시도합니다.
이 예제와 같은 몇 가지 특수한 경우에만 처리하려는 경우 특정 유니코드 문자를 ASCII 동등 문자로 대체합니다.
을 합니다.
unicodedata
모의normalize()
리고그고.string.encode()
가능한 한 가장 가까운 ASCII 대응물로 변환하는 방법(참조 https://web.archive.org/web/20090228203858/http ://techxplorer.com/2006/07/18/converting-unicode-to-ascii-using-python) :>>> teststr u'I don\xe2\x80\x98t like this' >>> unicodedata.normalize('NFKD', teststr).encode('ascii', 'ignore') 'I donat like this'
python 3 읽기 방법을 사용하여 인코딩된 텍스트 파일을 읽을 수도 있습니다.
f = open (file.txt, 'r', encoding='utf-8')
text = f.read()
f.close()
이 버전에서는 추가 라이브러리를 가져올 필요가 없습니다.
고려해야 할 몇 가지 사항이 있습니다.
\u2018 문자는 파이썬에서 유니코드 문자열의 일부로만 나타날 수 있습니다. 예를 들어 다음과 같이 쓸 경우:
>>> text = u'‘'
>>> print repr(text)
u'\u2018'
이제 유니코드 문자열을 예쁘게 인쇄하려면 유니코드의encode
방법:
>>> text = u'I don\u2018t like this'
>>> print text.encode('utf-8')
I don‘t like this
파의모행을유로읽면다으다사좋것습니이는용음하을일을 하는 것이 codecs.open
단순한 기능이 아닌 기능open
파일 인코딩을 지정할 수 있습니다.
>>> import codecs
>>> f1 = codecs.open(file1, "r", "utf-8")
>>> text = f1.read()
>>> print type(text)
<type 'unicode'>
>>> print text.encode('utf-8')
I don‘t like this
하지만 정말로 "나는 이것을 좋아하지 않는다"가 아니라 "나는 이것을 좋아하지 않습니다"입니다.u'\u2018' 문자는 ""와 완전히 다른 문자입니다(그리고 시각적으로 ''와 더 일치해야 합니다).
인코딩된 유니코드를 일반 ASCII로 변환하려는 경우 ASCII로 변환할 유니코드 구두점 매핑을 유지할 수 있습니다.
punctuation = {
u'\u2018': "'",
u'\u2019': "'",
}
for src, dest in punctuation.iteritems():
text = text.replace(src, dest)
유니코드에는 엄청나게 많은 구두점 문자가 있지만, 읽고 있는 문서를 만드는 응용 프로그램에서 실제로 사용되는 구두점 문자 중 일부만 사용할 수 있다고 생각합니다.
유니코드 이스케이프 문자가 포함된 비유니코드 문자열이 있을 수 있습니다. 예를 들어 다음과 같습니다.
>>> print repr(text)
'I don\\u2018t like this'
전에 한 번은 이런 일이 있었습니다.를 사용할 수 있습니다.unicode_escape
문자열을 유니코드로 디코딩한 다음 원하는 형식으로 인코딩하는 코덱:
>>> uni = text.decode('unicode_escape')
>>> print type(uni)
<type 'unicode'>
>>> print uni.encode('utf-8')
I don‘t like this
텍스트 파일이 손상되었다는 사실은 차치하고(U+2018은 아포스트로피가 아닌 왼쪽 따옴표입니다): iconv를 사용하여 유니코드 문자를 ascii로 변환할 수 있습니다.
모듈이 더 이상 지원되지 않는 것 같고 표준 홈 페이지를 찾을 수 없기 때문에 "iconvcodec"을 검색해야 합니다.
>>> import iconvcodec
>>> from locale import setlocale, LC_ALL
>>> setlocale(LC_ALL, '')
>>> u'\u2018'.encode('ascii//translit')
"'"
또는 다음을 사용할 수 있습니다.iconv
파일을 정리하는 명령줄 유틸리티:
$ xxd foo
0000000: e280 980a ....
$ iconv -t 'ascii//translit' foo | xxd
0000000: 270a '.
이것은 유니코드로 인코딩된 문자열을 보여주는 Pythons 방식입니다.하지만 저는 당신이 화면에 있는 문자열을 인쇄하거나 새로운 파일에 문제없이 쓸 수 있어야 한다고 생각합니다.
>>> test = u"I don\u2018t like this"
>>> test
u'I don\u2018t like this'
>>> print test
I don‘t like this
사실 U+2018은 특수 문자 '의 유니코드 표현입니다. 원하는 경우 다음 코드를 사용하여 해당 문자의 인스턴스를 U+0027로 변환할 수 있습니다.
text = text.replace (u"\u2018", "'")
추가로, 당신은 그 파일을 작성하기 위해 무엇을 사용하고 있습니까?f1.read()
다음과 같은 문자열을 반환해야 합니다.
'I don\xe2\x80\x98t like this'
이 문자열을 반환하는 경우 파일이 잘못 작성되고 있습니다.
'I don\u2018t like this'
(syslog="syslog") 옵션은 잘 모르겠지만 유니코드 문자가 이상한 파일에 사용할 수 있는 것 같습니다.
with open(fName, "rb") as fData:
lines = fData.read().splitlines()
lines = [line.decode("utf-8", errors="ignore") for line in lines]
언급URL : https://stackoverflow.com/questions/147741/character-reading-from-file-in-python
'your programing' 카테고리의 다른 글
jQuery: 양식 제출 시 어떤 버튼을 클릭했는지 확인하는 방법은 무엇입니까? (0) | 2023.08.30 |
---|---|
오라클의 다른 스키마에서 데이터 선택 (0) | 2023.08.30 |
pkg-config 검색 경로에서 패키지 카이로를 찾을 수 없습니다.노드 j.s 설치 캔버스 문제 (0) | 2023.08.10 |
열 nvarchar 길이를 드롭 없이 변경하는 방법 (0) | 2023.08.10 |
배치 삽입 및 LAST_INSERT_슬리크와 마리아의 아이디DB (0) | 2023.08.10 |