【问题标题】:Avoid writing carriage return '\r' when writing line feed with Python用 Python 写换行符时避免写回车符 '\r'
【发布时间】:2016-07-15 20:51:47
【问题描述】:

如果考虑到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++ 中打开文件时,你打开 View > Show Symbols > Show All Characters 你可以看到回车。

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

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

那么为什么Notepad++可以不用回车就可以保存换行,而python却不能呢?

【问题讨论】:

  • 我还是只想写\n,我不在乎操作系统做什么。如果我想指定要写入的特定字符,那么这就是我应该能够做的。
  • 我更新了这个问题,也许你会发现它不值得投反对票……并实际考虑答案
  • 使用open('name', 'w') 时不能避免写回车,因为模式w - write,text 是一种将LF 隐式更改为CRLF 的模式。您需要使用'wb' 以二进制模式打开文件。
  • open('filename','wb').write(bytes('text\n','UTF-8')) 有效。谢谢@TessellatingHeckler

标签: python carriage-return linefeed


【解决方案1】:

您可以通过在打开文本文件时将'' 传递给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)而不进行翻译。

【讨论】:

  • 这是我一直在寻找的,虽然我是使用二进制模式完成的
  • 这对我帮助很大!
猜你喜欢
  • 1970-01-01
  • 2012-04-18
  • 1970-01-01
  • 2020-02-24
  • 1970-01-01
  • 2011-03-25
  • 2012-05-16
  • 2012-03-06
  • 1970-01-01
相关资源
最近更新 更多