2013-05-14 4 views
7

내가 파이썬 튜토리얼에이 글을 읽을 : (http://docs.python.org/2/tutorial/inputoutput.html#reading-and-writing-files)파이썬은 바이너리 파일을 다루는데 위험한가요?

Windows에서 파이썬은 텍스트와 바이너리 파일을 구분하게

; 텍스트 파일의 줄 끝 문자는 데이터를 읽거나 쓸 때 약간 으로 자동 변경됩니다. ASCII 파일의 경우 데이터의 배후 수정이 좋지만 JPEG 또는 EXE 파일의 과 같은 이진 데이터가 손상됩니다. 읽을 때 이진 모드를 사용하고 이러한 파일을 쓰는 데는 을 사용하는 데 매우주의하십시오.

'텍스트 파일의 줄 끝 문자가 어떻게 변경되는지 이해하지 못해'이진 데이터가 손상됩니다. 바이너리 데이터에는 줄 끝과 같은 것들이 없기 때문에.

누군가 나를 위해이 단락을 더 설명 할 수 있습니까? 파이썬이 바이너리 파일을 환영하지 않는다는 느낌이 든다.

+4

"바이너리 모드를 사용할 때 ** 매우주의하십시오 **"가 아니라 "** 바이너리 모드를 사용하는 데 매우주의하십시오 ..."라고 읽습니다. 바이너리 모드는 안전합니다. – Matthias

답변

14

텍스트 파일이 아닌 바이너리 (open(filename, "rb"))로 Windows에서 파일을 열면됩니다. 그 후에는 데이터 사용에 문제가 없습니다.

특히 Windows의 줄 끝은 '\r\n'입니다. 그리고 바이너리 파일을 텍스트 파일로 읽고 다시 쓰면 '\n''\r\n' 시퀀스로 변환됩니다. 파일을 이진 파일 (읽기 및 쓰기 용)로 열면 아니요 같은 문제가 발생합니다.

파이썬은 바이너리 데이터를 처리 할 수 ​​있으므로 파이썬뿐만 아니라 Windows 시스템의 모든 언어에서 이러한 종류의주의를 기울여야합니다 (그러나 파이썬 개발자는 가능한 OS 문제). 줄 끝이 단일 문자 인 Linux와 같은 시스템에서도이 구분이 존재하지만 이진 데이터를 텍스트로 읽거나 쓸 때 (즉 파일 열기 옵션이없는 b 옵션이없는 경우) 문제가 발생할 가능성이 적습니다.

+0

알았어요. 파이썬 (및 다른 언어)은 'r'을 사용할 때 장면 뒤의 특수 문자 (줄 끝)를 처리합니다. 따라서 텍스트 모드를 사용하여 이진 파일을 처리하는 것은 잘못된 것입니다. –

2

이진 데이터에는 행 끝과 같은 내용이 없습니다.

이진 파일에는 문자 \ n을 포함한 모든 가능한 문자가 포함될 수 있습니다. 파이썬이 암시 적으로 이진 파일의 문자를 다른 것으로 변환하는 것을 원하지 않습니다. 파이썬은 당신이 그렇게 말하지 않으면 바이너리 파일을 읽는 것을 모른다. 파이썬이 텍스트 파일을 읽을 때 자동으로 \ n 문자를 OS의 개행 문자로 변환합니다.이 문자는 Windows에서 \ n \ n입니다.

모든 컴퓨터 프로그래밍 언어에서 일하는 방식입니다.

또 다른 방법은 파일이 긴 일련의 바이트 (8 비트) 일 뿐이라는 것입니다. 바이트는 단지 정수입니다. 그리고 바이트는 정수가 될 수 있습니다. 바이트가 정수 10이면 문자 \ n의 아스키 코드이기도합니다. 파일의 바이트가 바이너리 데이터를 나타내는 경우 파이썬이 10을 읽어서 두 바이트 (13과 10)로 변환하는 것을 원하지 않습니다. 일반적으로 바이너리 데이터를 읽을 때 처음 두 바이트를 읽으려고합니다. 숫자를 나타내는 다음 다른 숫자를 나타내는 다음 4 바이트를 나타냅니다. 분명히 파이썬이 갑자기 바이트 중 하나를 2 바이트로 변환하면 두 가지 문제가 발생합니다. 1) 데이터를 변경하고 2) 모든 데이터 경계를 엉망이 될거야.

예 : 파일의 첫 번째 바이트가 개의 가중치를 나타내는 것으로 가정하고 바이트의 값이 10이라고 가정합니다. 다음 바이트는 개의 나이를 나타내며 그 값은 1입니다. 파이썬이 두 바이트 \ n에 아스키 코드는 10, 10, 13, 데이터 파이썬 손을 당신은 다음과 같이 표시됩니다

10 13 1

그리고 당신은에 대한 두 번째 바이트를 추출 할 때 강아지의 나이가되면 13 세가됩니다. 1

파일에는 '문자'가 포함되어 있지만 종종 거짓말이라고합니다. 컴퓨터는 문자를 저장할 수 없습니다. 그들은 단지 숫자를 저장할 수 있습니다. 따라서 파일은 일련의 긴 숫자 일뿐입니다. 파이썬이 그 숫자를 문자를 나타내는 아스키 코드로 취급한다면 파이썬이 텍스트를 줄 것이다.

1

필자는 파이썬 매뉴얼에서 "약간 변경되었다"는 말은 유닉스의 줄 끝 문자를 Windows의 줄 끝 문자로 변환하는 것을 의미한다고 가정합니다. 이것은 Windows에서만 이루어지기 때문에 Unix와 Linux는 이런 문제가 없습니다.

관련 문제