我在Python教程上阅读了这篇文章:(http://docs.python.org/2/tutorial/inputoutput.html#reading-and-writing-files)
Windows上的Python区分了文本和二进制文件; 文本文件中的行尾字符会自动略微更改 何时读取或写入数据。这种对文件的幕后修改 数据适用于ASCII文本文件,但它会破坏这样的二进制数据 在JPEG或EXE文件中。阅读时要非常小心使用二进制模式 写这样的文件。
我不太明白'文本文件中的行尾字符是如何被改变'将'破坏二进制数据'。 因为我觉得二进制数据没有像行尾这样的东西。
有人可以为我解释这段话的更多内容吗?这让我觉得Python不欢迎二进制文件。
答案 0 :(得分:14)
您只需要小心打开Windows上的二进制文件(open(filename, "rb")
)而不是文本文件。之后使用数据没有问题。
特别是Windows上的行尾为'\r\n'
。如果您将二进制文件作为文本文件读取并将其写回,则单个'\n'
将在'\r\n'
个序列中进行转换。如果您将文件打开为二进制文件(用于阅读和写作),则会出现 no 这样的问题。
Python能够处理二进制数据,你必须采用Windows系统上的任何语言,而不仅仅是Python(但Python的开发人员足够友好,可以警告你可能的操作系统问题)。在Linux这样的系统中,行尾是单个字符,这种区别也存在,但在将二进制数据作为文本读取/写入时不太可能导致问题(即没有b
选项可以打开文件)。
答案 1 :(得分:2)
我觉得二进制数据没有像行尾这样的东西。
二进制文件中可以包含任何可能的字符,包括字符\ n。您不希望python隐式地将二进制文件中的任何字符转换为其他字符。除非你这么说,否则Python不知道它正在读取二进制文件。当python读取文本文件时,它会自动将任何\ n字符转换为操作系统的换行符,在Windows上为\ r \ n。
这就是所有计算机编程语言的工作方式。
考虑它的另一种方法是:文件只是一长串字节(8位)。一个字节只是一个整数。一个字节可以是任何整数。如果一个字节恰好是整数10,那么它也是字符\ n的ascii代码。如果文件中的字节表示二进制数据,则不希望Python读入10并将其转换为两个字节:13和10.通常当您读取二进制数据时,您想要读取前两个数据表示一个数字的字节,然后是代表另一个数字等的接下来的4个字节。显然,如果python突然将其中一个字节转换为两个字节,那将导致两个问题:1)它改变数据,2)所有你的数据边界将被弄乱。
一个例子:假设文件的第一个字节应该代表狗的权重,而字节的值是10.然后下一个字节应该代表狗的权重。 age,它的值是1.如果Python将10(即\ n的ascii代码)转换为两个字节:10和13,那么数据python将显示为:
10 13 1
当你为狗的年龄提取第二个字节时,你会得到13而不是1。
我们经常说一个文件包含'字符'但这显然是错误的。计算机无法存储字符;他们只能存储号码。所以文件只是一长串数字。如果你告诉python将这些数字视为表示字符的ascii代码,那么python将为你提供文本。
答案 2 :(得分:1)
我认为Python手册中的“略有改动”意味着将Unix行尾字符转换为Windows行尾字符。因为这只在Windows中完成,所以Unix和Linux没有这个麻烦。