文本文件与二进制文件的区别,以及windows下的换行符
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异常请求
然而写进文件却是这个鬼样子:
rtsp异常请求日志记录
会什么会产生多余空白行呢?
原因就是RTSP数据报中行结束标识'\r\n',结合2中的总结,不难发现,当以文本模式写进文件时,python会将'\r'以及'\n'自动隐式转换为'\r\n',因为windows上的换行符就是'\r\n',于是rtsp数据报每一行后面的'\r\n'都被转换为'\r\n\r\n',在windows系统上代表两个换行符,于是就产生了多余空白行。
最终的解决方法是将rtsp请求中的‘\r\n’替换掉,问题解决。
修改后写入文件结果为: