1. 文本文件与二进制文件的区别
对于文本文件,比如 .txt 文件、.c 文件、.dat 文件等,使用一般的文本编辑器打开文件,我可以顺利看懂文件内容;而二进制文件通常用于保存音频、图片等不可直接阅读的内容,当使用文本编辑器打开二进制文件时,会看到一堆乱码,无法理解文件内容的实际语义。
实际上,从数据存储的角度来看,文本文件和二进制文件都是以二进制的形式存储在磁盘上。
我们之所以能看懂文本文件,是因为文本文件采用ASCII、UTF-8、GBK等字符编码,例如UTF-8字符编码,对于一个汉字会转换为3个字节进行存储,而GBK字符编码会将一个汉字转换为2个字节进行存储,文本编辑器能正确解码这些二进制数据,所以文本编辑器能正确显示文本文件的字符内容;而对于二进制文件,文本编辑器不知道要用那种字符编码对其进行解析,因此会看到一堆乱码。
2. python中按照文本格式和二进制格式打开文件的区别
python文件操作中函数open()函数可以按照文本格式和二进制格式打开文件,两者的本质区别在对文本换行符的处理不同。
在 Windows 系统中,文件中用 "\r\n" 作为行末标识符(即换行符),当以文本格式读取文件时,会将 "\r\n" 转换成 "\n";反之,以文本格式将数据写入文件时,会将 "\n" 转换成 "\r\n"。这种隐式转换换行符的行为,对用文本格式打开文本文件是没有问题的,但如果用文本格式打开二进制文件,就有可能改变文本中的数据(将 \r\n 隐式转换为 \n)。
而在 Unix/Linux 系统中,默认的文件换行符就是 \n,因此在 Unix/Linux 系统中文本格式和二进制格式并无本质的区别。
3. python写进文件产生多余空白行?
最近在写一个rtsp请求的语法异常检测程序,想把检测到的异常请求记录到日志文件,检测到异常请求用wireshark可查如下:
然而写进文件却是这个鬼样子:
会什么会产生多余空白行呢?
原因就是RTSP数据报中行结束标识'\r\n',结合2中的总结,不难发现,当以文本模式写进文件时,python会将'\r'以及'\n'自动隐式转换为'\r\n',因为windows上的换行符就是'\r\n',于是rtsp数据报每一行后面的'\r\n'都被转换为'\r\n\r\n',在windows系统上代表两个换行符,于是就产生了多余空白行。
最终的解决方法是将rtsp请求中的‘\r\n’替换掉,问题解决。
修改后写入文件结果为:
补充:文本或代码中 \n 和 \r 的区别
在ASCII码中,我们会看到有一类不可显示的字符,叫控制字符,其中就包含\r 和 \n 等控制字符。
\n : 换行符(newline),另起一行,对应ASCII值10(缩写:LF)。
\r : 回车符(return),回到一行的开头,对应ASCII值13(缩写:CR)。
1. \n 和 \r差异
- '\r'是回车,使光标到行首;
- '\n'是换行,使光标下移一格;
Enter键就是两个加起来的效果。
有的编辑器只认\r\n,有的编辑器则两个都认。所以要想通用的话,最好用\r\n换行。
- 在微软的MS-DOS和Windows中,使用“回车CR(‘\r’)和换行LF(‘\n’)两个字符作为换行符;
- Windows系统里面,每行结尾是 回车+换行(CR+LF),即”\r\n";
- Unix系统里面,每行结尾只有 换行CR,即“\n”;
- Mac系统里面,每行结尾是 CR,即“\r ";
- 所以我们平时编写文件的回车符应该确切来说叫做回车换行符。
2. 影响
一个直接后果是,Unix/Mac系统下的文件在Windows里打开的话,所有文字会变成一行;而Windows里的文件在Unix/Mac下打开的话,在每行的结尾可能会多出一个^M符号。
Linux保存的文件在windows上用记事本看的话会出现黑点。
互相转换
在linux下,命令unix2dos 是把linux文件格式转换成windows文件格式,命令dos2unix 是把windows格式转换成linux文件格式。
在不同平台间使用FTP软件传送文件时, 在ascii文本模式传输模式下, 一些FTP客户端程序会自动对换行格式进行转换. 经过这种传输的文件字节数可能会发生变化。
如果你不想ftp修改原文件, 可以使用bin模式(二进制模式)传输文本。一个程序在windows上运行就生成CR/LF换行格式的文本文件,而在Linux上运行就生成LF格式换行的文本文件。