使用Python编写换行符时避免写回车符

时间:2016-07-15 20:51:47

标签: python carriage-return linefeed

如果考虑到carriage return = \rline feed = \n

Python 3.5.1 (v3.5.1:37a07cee5969, Dec  6 2015, 01:38:48) [MSC v.1900 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> '{:02x}'.format(ord('\n'))
'0a'
>>> '{:02x}'.format(ord('\r'))
'0d'

使用open('filename','w').write('text\n')时如何避免写回车?

在交互模式下,您可以执行以下操作:

>>> open('filename','w').write('text\n')
5
>>> for c in open('filename','r').read():
...     print('{:02x}'.format(ord(c)))
...
74
65
78
74
0a

这表示只写入换行符,因此它应该是5个字节长。

-rw-r--r-- 1 djuric 197121        6 Jul 15 21:00 filename
                                  ^

实际上是6个字节长。现在这可以是一个" Windows的东西",但是当您在Notepad ++中打开文件时,然后转动查看>显示符号>显示所有字符您可以看到那里的回车。

按下CTRL + H并使用扩展搜索模式替换\ r时,只剩下换行符。保存文件后,只有换行符在文件中,文件长度为5个字节。

-rw-r--r-- 1 djuric 197121    5 Jul 15 20:58 filename1
                              ^

那么为什么Notepad ++能够在没有回车的情况下保存换行符,但是python不能?

1 个答案:

答案 0 :(得分:9)

您可以在打开文本文件时将''传递给newline参数来执行此操作。

f = open('test.txt', 'w', newline='')
f.write('Only LF\n')
f.write('CR + LF\r\n')
f.write('Only CR\r')
f.write('Nothing')
f.close()

docs

中所述
  

换行符控制通用换行模式的工作方式(仅适用于   文字模式)。它可以是None,'','\ n','\ r'和'\ r \ n'。它起作用   如下:

     
      
  • 从流中读取输入时,如果换行为“无”,则启用通用换行模式。输入中的行可以以'\ n','\ r'或者结尾   '\ r \ n',这些在返回之前会被翻译成'\ n'   呼叫者,召集者。 如果是'',则启用通用换行模式,但行   结尾将返回给调用者未翻译。如果有任何结果   其他合法值,输入行仅由给定的终止   字符串,并将行结尾返回给未翻译的调用者。

  •   
  • 将输出写入流时,如果换行为None,则写入的任何“\ n”字符都将转换为系统默认行   分离器,os.linesep。如果换行符是''或'\ n',则不需要翻译   地点。如果换行符是任何其他合法值,则为'\ n'   写的字符被翻译成给定的字符串。

  •   

newline的默认值为None,通过指定'',您迫使Python编写换行符\n\r)翻译它。