IT이야기

r 및 rb 모드에서 텍스트 파일 구문 분석의 차이점

cyworld 2021. 4. 5. 21:15
반응형

r 및 rb 모드에서 텍스트 파일 구문 분석의 차이점


'rb'모드에서 구문 분석하는 것보다 'r'모드에서 텍스트 파일을 구문 분석하는 것이 더 편리한 이유는 무엇입니까? 특히 문제의 텍스트 파일에 ASCII가 아닌 문자가 포함될 수 있습니다.


이것은 사용중인 Python 버전에 따라 약간 다릅니다. Python 2에서는 Chris Drappier의 답변이 적용됩니다.

Python 3에서는 다른 (그리고 더 일관된) 스토리 : 텍스트 모드 ( 'r')에서 Python은 사용자가 제공 한 텍스트 인코딩에 따라 파일을 구문 분석합니다 (또는 제공하지 않는 경우 플랫폼에 따라 기본값). , 그리고 read()당신에게 str. 바이너리 ( 'rb') 모드에서 Python은 파일에 문자로 합리적으로 구문 분석 할 수있는 항목이 포함되어 있다고 가정하지 않고 객체를 read()제공 bytes합니다.

또한 Python 3에서는 Windows뿐만 아니라 모든 플랫폼의 '\n'텍스트 모드 파일에 대해 범용 줄 바꿈 ( 및 플랫폼 별 줄 바꿈 규칙 간 변환 )을 사용할 수 있습니다 .


로부터 문서 :

Windows에서 모드에 'b'가 추가되면 바이너리 모드로 파일이 열리므로 'rb', 'wb'및 'r + b'와 같은 모드도 있습니다. Windows의 Python은 텍스트와 바이너리 파일을 구분합니다. 텍스트 파일의 줄 끝 문자는 데이터를 읽거나 쓸 때 자동으로 약간 변경됩니다. 파일 데이터에 대한 이러한 비하인드 수정은 ASCII 텍스트 파일에 적합하지만 JPEG 또는 EXE 파일과 같은 바이너리 데이터를 손상시킵니다. 이러한 파일을 읽고 쓸 때 바이너리 모드를 사용하는 데 매우주의하십시오. Unix에서는 모드에 'b'를 추가하는 것이 문제가되지 않으므로 모든 바이너리 파일에 대해 플랫폼 독립적으로 사용할 수 있습니다.


차이점은 EOL (End-of-Line) 처리 방법에 있습니다. 운영 체제마다 다른 문자를 사용하여 EOL을 표시합니다 ( \nUnix, \rOS X 이전 Mac 버전, \r\nWindows). 파일이 텍스트 모드로 열릴 때 파일을 읽을 때 Python은 파일에서 읽은 OS 특정 줄 끝 문자를 \n. 그 반대의 경우도 마찬가지입니다. 즉, \n텍스트 모드에서 열린 파일에 쓰려고하면 OS 별 EOL 문자를 쓰게됩니다. 을 확인하여 OS 기본 EOL을 찾을 수 있습니다 os.linesep.

바이너리 모드에서 파일을 열면 매핑이 수행되지 않습니다. 당신이 읽는 것은 당신이 얻는 것입니다. 텍스트 모드는 기본 모드입니다. 따라서 텍스트가 아닌 파일 (이미지, 비디오 등)을 처리하는 경우 바이너리 모드에서 파일을 열어야합니다. 그렇지 않으면 일부 바이트를 도입 (또는 제거)하여 파일을 엉망으로 만들 수 있습니다.

Python에는 범용 개행 모드도 있습니다. 파일이이 모드에서 열릴 때, 파이썬은 모든 문자 매핑 \r, \n그리고 \r\n에를 \n.


명확하고 Agostino의 의견 / 질문 에 대답하기 위해 (나는 의견을 제시 할 충분한 평판이 없으므로 이것을 답변으로 언급하면서 참아주십시오 ...) :

Python 2에서는 텍스트 모드 나 바이너리 모드 모두에서 행 끝 수정이 발생하지 않습니다. 이전에 언급했듯이 Python 2에서는 Chris Drappier의 답변이 적용됩니다 (현재 링크는 3.x Python 문서를 가리 키지 만 Chris의 인용 텍스트는 다음과 같습니다. 물론 Python 2 입력 및 출력 튜토리얼에서 )

따라서 Windows아닌 곳 에서 Python 2를 사용 하여 텍스트 모드로 파일을 열면 줄 끝이 수정 되는 것은 사실 아닙니다 .

0 $ cat data.txt 
line1
line2
line3
0 $ file data.txt 
data.txt: ASCII text, with CRLF line terminators
0 $ python2.7 -c 'f = open("data.txt"); print f.readlines()'
['line1\r\n', 'line2\r\n', 'line3\r\n']
0 $ python2.7 -c 'f = open("data.txt", "r"); print f.readlines()'
['line1\r\n', 'line2\r\n', 'line3\r\n']
0 $ python2.7 -c 'f = open("data.txt", "rb"); print f.readlines()'

그러나 Python 2에서 범용 개행 모드로 파일을 열 수 있으며, 이는 정확히 말한 줄 끝 모드를 수행합니다.

0 $ python2.7 -c 'f = open("data.txt", "rU"); print f.readlines()'
['line1\n', 'line2\n', 'line3\n']

(범용 줄 바꿈 모드 지정자는 Python 3.x에서 더 이상 사용되지 않습니다.)

반면에 Python 3에서 플랫폼 별 줄 끝은 텍스트 모드에서 파일을 읽을 때 '\ n'으로 정규화되고 '\ n'은 텍스트 모드에서 쓸 때 현재 플랫폼의 기본 줄 끝으로 변환됩니다 ( 텍스트 모드에서 진행되는 bytes <-> unicode <-> bytes 디코딩 / 인코딩 외에도). 예를 들어 Linux에서 Dos / Win CRLF 행 끝 파일을 읽으면 행 끝이 '\ n'으로 정규화됩니다.

참조 URL : https://stackoverflow.com/questions/9644110/difference-between-parsing-a-text-file-in-r-and-rb-mode

반응형