>  기사  >  백엔드 개발  >  파이썬과 코딩

파이썬과 코딩

黄舟
黄舟원래의
2016-12-16 11:34:241210검색

Python의 리터럴 객체

Python 3.x에서 텍스트를 처리하는 객체에는 str, bytes 및 bytearray가 있습니다.

바이트 및 bytearray는 형식 지정에 사용되는 방법(format, format_map)과 여러 특수 유니코드 기반 방법(casefold, isdecimal, isidentifier, isnumeric, isPRintable, encode)을 제외한 거의 모든 str을 사용할 수 있습니다.

bytes에는 시퀀스를 통해 문자열을 구성할 수 있는 클래스 메서드가 있지만 이 메서드는 str에서 사용할 수 없습니다.

>>> b = bytes.fromhex('E4 B8 AD')
>>>b
b'xe4xb8xad'
>>> b.decode('utf-8')
'中'
>>> str(b)
"b'\xe4\xb8\xad'"

유니코드 및 문자 변환

유니코드 코드 포인트를 문자로 변환하려면 chr을 사용하고, 반대 작업을 수행하려면 ord를 사용하세요.

>>> ord('A')
65
>>> ord('中')
20013
>> chr(65)
'A'
>>> chr(20013)
'中'

len 함수는 문자 개수가 아닌 문자 개수를 계산합니다. bytes

>>> len('中')
1
>>> '中'.encode('utf-8')
b'xe4xb8xad '
>>> len('中'.encode('utf-8')) # 3개의 정수 문자를 포함하는 바이트열 객체의 길이를 계산합니다.
3

Python 및 인코딩

Python이 내부적으로 인코딩을 처리하는 방식

Python이 입력을 수락하면 항상 먼저 유니코드로 변환됩니다. 그리고 이 과정은 빠를수록 좋습니다.
그러면 Python 처리는 항상 유니코드로 수행됩니다. 이 과정에서 인코딩 변환이 수행되지 않아야 합니다.
Python이 결과를 반환하면 항상 유니코드에서 필요한 인코딩으로 변환됩니다. 그리고 이 과정이 나중에 일어날수록 좋습니다.

Python 소스 코드의 인코딩 방법

Python은 기본적으로 utf-8 인코딩을 사용합니다.
Python 코드를 저장하기 위해 다른 인코딩을 사용하려는 경우 각 파일의 첫 번째 또는 두 번째 줄에 인코딩 선언을 배치할 수 있습니다(첫 번째 줄이 hash-bang 명령에 의해 점유된 경우) )
# ‐*‐ 코딩: windows‐1252 ‐*‐

Python에서 사용되는 코딩

C:UsersJL>chcp #운영 체제에서 사용되는 코딩 찾기
활성 코드 페이지: 936
>>> import sys, locale
>>> locale.getpreferredencoding() #이것이 가장 중요합니다
'cp936'
>>> ; ('cafe.txt','r')
>>> type(my_file)

>>> 파일 객체는 기본적으로
'cp936'
>>> sys.stdout.isatty(), sys.stdin.isatty(), sys.stderr 값을 사용합니다. () #출력이 콘솔인지 여부
(True, True, True)
>>> sys.stdout.encoding, sys.stdin.encoding, sys.stderr.encoding #sys 표준 If 제어 흐름이 파일로 리디렉션되거나 전달되면 인코딩은 환경 변수 PYTHONIOENCODING의 값, 콘솔 인코딩 또는 locale.getpreferredencoding()의 인코딩을 사용하며 우선 순위는 순서대로 감소합니다.
('cp936', 'cp936', 'cp936')
>>> sys.getdefaultencoding() # Python이 이진 데이터를 문자 객체로 변환해야 하는 경우 기본값으로 이를 사용합니다.
'utf-8'
>>> sys.getfilesystemencoding() # Python을 사용하여 파일 이름(파일 내용 아님)을 인코딩하거나 디코딩하는 경우 기본적으로 이 인코딩이 사용됩니다.
'mbcs'

위는 Windows에서의 테스트 결과입니다. GNU/linux 또는 OSX의 경우 모든 결과는 UTF-8입니다.
mbcs 및 utf -8에 대해 차이점이 있는 경우 http://stackoverflow.com/questions/3298569/difference-between-mbcs-and-utf-8-on-windows

파일 읽기 및 쓰기를 위한 인코딩

>>> pen('cafe.txt','w',encoding='utf-8').write('café')

4
>>> ('cafe.txt','r')
>>> fp.read()
'caf Mao'
>>> fp.encoding
'cp936'
>>> open('cafe.txt','r', 인코딩 = 'cp936').read()
'caf 마오'
>>> Cafe.txt','r', 인코딩 = 'latin1').read()
'café'
>>> fp = open('cafe.txt','r', 인코딩 = 'utf-8')
>>> fp.encoding
'utf-8'

위의 예에서 볼 수 있듯이 언제든지 기본 인코딩을 사용하지 마십시오. 다른 컴퓨터에서 실행할 때 예상치 못한 문제가 발생할 수 있기 때문입니다.

Python이 유니코드 문제를 처리하는 방법

Python은 항상 코드 포인트를 통해 문자열의 크기를 비교하거나 동일한지 여부를 비교합니다.

유니코드에서 악센트 기호를 표현하는 방법에는 1바이트로 표현되거나 기본 문자와 악센트 기호로 표현되는 두 가지 방법이 있습니다. 그러나 Python에서는 코드 포인트 크기를 통해 비교되기 때문에 동일합니다. , 그래서 그들은 동일하지 않습니다.

>>> c1 = 'cafeu0301'
>>> c2 = '카페'
>>> c1 == c2
거짓 >>>> len(c1), len(c2)
(5, 4)

해결책은 유니코드 데이터 라이브러리의 정규화 함수를 전달하는 것입니다. 이 기능 매개변수는 4개의 매개변수 "NFC",'NFD','NFKC','NFKD' 중 하나를 받아들일 수 있습니다.

NFC(Normalization Form Canonical Composition): 표준 등가 방식으로 분해한 후, 표준 등가 방식으로 재조립합니다. 싱글톤인 경우 재구성 결과가 분해 전과 다를 수 있습니다. 전체 문자열의 길이를 최대한 줄여서 'eu0301'의 2바이트가 'é'의 1바이트로 압축됩니다.
NFD(Normalization Form Canonical Decomposition): 표준 등가 방식으로 분해
NFKD(Normalization Form Compatibility Decomposition): 호환 등가 방식으로 분해
NFKC(Normalization Form Compatibility Composition): 일관된 등가 방식으로 분해 방식 용량 동일하게 분해한 후, 표준 동일 방식으로 재조립합니다.
NFKC 및 NFKD는 데이터 손실을 일으킬 수 있습니다.

from unicodedata import Normalize

>>> c3 =normalize('NFC',c1) #문자열 길이를 줄이는 방향의 c1 작업
>>> (c3)
4
>>> c3 == c2

>>> c4 = 정규화('NFD',c2)
>> > len(c4)
5
>>> c4 == c1
True

서양 키보드는 일반적으로 가능한 가장 짧은 문자열을 입력합니다. , 결과는 "NFC"와 일치하지만 "NFC"를 통해 작동시킨 다음 문자열이 같은지 비교하는 것이 더 안전합니다. 그리고 W3C에서는 "NFC" 결과를 사용할 것을 권장합니다.

유니코드에서는 동일한 문자가 두 가지 다른 인코딩을 갖습니다.

이 함수는 단일 유니코드 문자를 다른 유니코드 문자로 변환합니다.

>>> o1 = 'u2126'

>> o2 = 'u03a9'
>>o1, o2
('Ω' , 'Ω')
>>> o1 == o2
거짓
>>> 이름(o1), 이름(o2)
('OHM SIGN', ' 그리스어 대문자 OMEGA')
>>> o3 = Normalize('NFC',o1)
>>> 이름(o3)
'그리스어 대문자 OMEGA'
>> u2 = 'u03bc'
>>>u1,u2
('μ', 'μ')
>>> )

('MICRO SIGN', 'GREEK SMALL LETTER MU')

>>> u3 = Normalize('NFKD',u1)

>>> 🎜>' 그리스어 소문자 MU'



또 다른 예

>>> h1 = 'u00bd'
>>> NFKC' ,h1)
>>> h1, h2
('½', '1⁄2')
>>> 🎜> (1, 3)

때때로 비교를 위해 대소문자를 구분하지 않는 형식을 사용하고 싶을 때가 있습니다.

비교를 위해 대문자를 소문자로 변환하는 str.casefold() 메서드를 사용하세요. 예를 들어 'A'는 'a'로 변환되고 'MICRO SIGN'의 'μ'는 'GREEK SMALL LETTER MU'의 'μ'로 변환됩니다.

대부분(98.9%)의 경우 str.casefold( ) 결과는 str.lower()와 일치합니다.

텍스트 정렬
언어 규칙이 다르기 때문에 단순히 Python의 코드 포인트 비교 방법을 따른다면 사용자가 기대하지 않는 결과가 많이 나올 것입니다.
보통 정렬에는 locale.strxfrm이 사용됩니다.

>>> 로케일 가져오기

>>> locale.setlocale(locale.LC_COLLATE,'pt_BR.UTF-8')

'pt_BR.UTF-8'
>>> sort_result = sorted(intial, key = locale.strxfrm)

인코딩 및 디코딩 오류

Python 소스 코드에 디코딩 오류가 있는 경우 , 그러면 SyntaxError 예외가 생성됩니다.

그 외의 경우 인코딩 및 디코딩 오류가 발견되면 UnicodeEncodeError 및 UnicodeDecodeError 예외가 생성됩니다.


유창한 Python에서 가져온 몇 가지 유용한 방법

from unicodedata import 정규화, 결합
def nfc_equal(s1, s2):
   '''return "NFC"에서 정규화 후 문자열 s1이 문자열 s2와 동일하면 True '''
   return 정규화 ("NFC",s1) == Normalize("NFC",s2)

deffold_equal(s1, s2):
   '''return 정규화 후 문자열 s1이 문자열 s2와 동일하면 True입니다. "NFC" 및 casefold()'''
   return Normalize('NFC',s1).casefold() == Normalize('NFC',s2).casefold()

def shake_marks(txt ):
   '''모든 발음 구별 부호 제거
   기본적으로 라틴어 텍스트를 순수 ASCII로 변경하기만 하면 되지만 이 기능은 그리스 문자도 변경합니다
   shave_latin_marks 아래의 기능이 더 정확합니다.'''

   normal_txt = Normalize('NFD',txt)
   shaved = ''.join(c for c innormal_txt if not Combine(c))
   return Normalize('NFC',shaved)

def shake_latin_marks(txt):
   '''라틴어 기본 문자에서 모든 발음 구별 부호 제거'''
   normal_txt = Normalize('NFD',txt)
   keeping = []
   latin_base =False
   normal_txt의 c에 대해:
       (c)와 latin_base를 결합한 경우:
           continue    #라틴어 기본 문자에 Ingore 발음 구별 기호
       keeping.append(c)
       #If 결합하는 게 아니다 char, 새로운 기본 문자여야 합니다
       결합하지 않는 경우(c):
           latin_base = c in string.ascii_letters

编码探嗅Chardet

这是Python의 응용 프로그램

参考资料:

http://blog.csdn.net/tcdddd/article/details/8191464

 以上就是python与编码的内容,更多更关文章请关注PHP中文网(www.php.cn)!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
이전 기사:Python 지식 요약다음 기사:Python 지식 요약