Python处理二进制文件是否危险?



我在Python教程上读到这个:(http://docs.python.org/2/tutorial/inputoutput.html#reading-and-writing-files)

Windows上的Python区分文本文件和二进制文件;文本文件中的行尾字符会自动稍微改变读取或写入数据时。这是对文件的幕后修改data对于ASCII文本文件没有问题,但它会破坏二进制数据JPEG或EXE文件。在读取和时要非常小心地使用二进制模式写这样的文件

我不太明白"文本文件中的行尾字符被改变"将"破坏二进制数据"。因为我觉得二进制数据没有像行尾这样的东西。

谁能给我详细解释一下这段话吗?这让我觉得Python不欢迎二进制文件

您只需要注意在windows上以二进制(open(filename, "rb"))而不是文本文件打开文件。之后使用数据就没有问题了。

特别是在Windows上的行尾是'rn'。如果您将二进制文件作为文本文件读取并将其写出来,则单个'n'将转换为'rn'序列。如果你打开二进制文件(读和写),有没有这样的问题。

Python能够处理二进制数据,您在windows系统上的任何语言中都必须注意这一点,而不仅仅是在Python中(但是Python的开发人员非常友好,会警告您可能存在的操作系统问题)。在像Linux这样的系统中,行尾是单个字符,这种区别也存在,但在读写二进制数据作为文本时(即没有打开文件的b选项)不太可能导致问题。

我觉得二进制数据没有像行尾这样的东西。

二进制文件可以包含任何可能的字符,包括字符n。您不希望python隐式地将二进制文件中的任何字符转换为其他内容。Python不知道它正在读取二进制文件,除非您这样告诉它。当python读取文本文件时,它会自动将任何n字符转换为操作系统的换行字符,在Windows上是rn。

这是所有计算机编程语言的工作方式。

另一种思考方式是:文件只是一长串字节(8位)。字节就是一个整数。一个字节可以是任何整数。如果一个字节恰好是整数10,那么它也是字符n的ascii码。如果文件中的字节表示二进制数据,您不希望Python读取10并将其转换为两个字节:13和10。通常当你读取二进制数据时,你想要读取,比如说,前2个字节代表一个数字,然后接下来的4个字节代表另一个数字,等等。显然,如果python突然将一个字节转换为两个字节,这将导致两个问题:1)它改变了数据,2)所有的数据边界将被打乱。

举个例子:假设一个文件的第一个字节代表一只狗的体重,这个字节的值是10。然后下一个字节应该代表狗的年龄,其值为1。如果Python将10 (n的ascii码)转换为两个字节:10和13,那么Python传递给您的数据将是:

10 13 1

当你提取狗的年龄的第二个字节时,你得到13——而不是1。

我们经常说一个文件包含'字符',但这显然是错误的。计算机不能存储字符;它们只能存储数字。文件就是一长串数字。如果你告诉python把这些数字当作ascii码(表示字符)来处理,那么python就会给你文本。

我想Python手册中的"slightly alter"是指将Unix的行尾字符转换为Windows的行尾字符。因为这只在Windows中完成,所以Unix和Linux没有这个麻烦。

最新更新