您的位置:首页 > 编程语言 > Python开发

回车(\r)和换行(\n)真蛋疼

2015-06-17 16:46 525 查看
对于一般的windows文本文档,每一行结尾都有“\r\n”这么四个字符,但是实际上你用记事本打开的时候是看不到这玩意儿的。

比如说,对于一个.csv文件,用记事本打开的时候是这个样子的:



用Excel打开是这个样子的:



用python3.4的二进制方式读取打开是这个样子的:(注意左上角的那个‘rb’,其实不用二进制,用文本的方式打开也一样)



可以看到每一行的结尾都有“\r\n”,太多所以我就不全不圈起来了。

不过对于windows环境下,当python在写入\n的时候,会自动补上一个\r,这一点特别蛋疼。听说是因为:

标准C的流提供系统无关抽象层

在C中使用fopen打开一个文本文件时流实现了实际换行符与C中\n之间的转换。在windows中当我们用fopen打开文本文件,然后从中读到\r\n时流会转换为\n,而当我们往文件中写入\n时流会转换为\r\n

因为流只对文本文件进行换行表示的转换,以二进制模式打开流不会做任何处理。所以当你以二进制模式打开一个文本文件时将产生错乱,你必须亲自将\r\n解释为\n

那么我猜python也是这么搞的。废话少说上代码:

file=open('F:\\Airline On Time Performence Data--Gov USA\\Main Data\\1987.csv\\1987e.csv','rb') #encoding='utf-8'
t=open('F:\\Airline On Time Performence Data--Gov USA\\Main Data\\1987.csv\\1987g.csv','a')    #'a'其实就是追加,以文本方式追加
while True:
f=file.readline()
if f:
pass
else:
break
for line in f:
if line>127:    #注意这一行!
continue
t.write(chr(line))
t.close()


这是一个删掉文本中乱码的程序,用line>127来控制

但是如果直接这么以文本方式写入,会发现换行处有两个\r!这其实就是写入\n时流会转换为\r\n

最开始傻逼兮兮地把”if line>127”改成了”if line>127 or line==10”,实际上就是把\n给略掉了,结果出来就只剩\r了,虽然对于Excel来说,读出来的效果都是一样的,但是以记事本打开就会发现并没有换行!

而如果改成”if line>127 or line==10 or line==13”,则连\r都略掉了,结果得到一个大长串。。。。

最终还是改成了”if line>127 or line==13”,保留了\n,略掉了\r,那么在写入的时候,略掉的\r会被自动补上!

忘了说了

回车”(Carriage Return)和“换行”(Line Feed)这两个概念的来历和区别。

符号 ASCII码 意义

\n 10 换行

\r 13 回车CR
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python