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

Ubi*_*ica 8 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'
Run Code Online (Sandbox Code Playgroud)

使用时如何避免写回车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
Run Code Online (Sandbox Code Playgroud)

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

-rw-r--r-- 1 djuric 197121        6 Jul 15 21:00 filename
                                  ^
Run Code Online (Sandbox Code Playgroud)

它实际上是6个字节长.现在这可以是"Windows的东西",但是当您在Notepad ++中打开文件时,如果您打开视图>显示符号>显示所有字符,您可以看到回车符.

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

-rw-r--r-- 1 djuric 197121    5 Jul 15 20:58 filename1
                              ^
Run Code Online (Sandbox Code Playgroud)

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

ƘɌỈ*_*ƬƠƑ 12

您可以通过在打开文本文件时传递''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()
Run Code Online (Sandbox Code Playgroud)

文档中所述:

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

  • 从流中读取输入时,如果换行为"无",则启用通用换行模式.输入中的行可以以'\n','\ r'或'\ r \n'结尾,并且在返回给调用者之前将这些行转换为'\n'.如果是'',则启用通用换行模式,但行结尾将返回到未翻译的调用者.如果它具有任何其他合法值,则输入行仅由给定字符串终止,并且行结尾将返回给未调用的调用者.

  • 将输出写入流时,如果换行为None,则写入的任何"\n"字符都将转换为系统默认行分隔符os.linesep.如果换行符是''或'\n',则不会进行翻译.如果换行符是任何其他合法值,则写入的任何"\n"字符都将转换为给定的字符串.

newlineis 的默认值是None,通过指定'',您强制Python在不翻译的情况下编写换行符(\n\r).