16

我正在寻找一种方法来确保在读取、编辑和写入时在 python 程序中保持文件的行尾样式。

Python 具有通用的文​​件结尾支持,可以将所有行结尾转换\n为读取文件时,然后在写入文件时将它们全部转换为系统默认值。就我而言,我仍想进行初始转换,但随后使用原始 EOL 样式而不是系统默认值编写文件。

有没有标准的方法来做这种事情?如果没有,是否有检测文件 EOL 样式的标准方法?

假设没有标准的方法来做到这一点,一个可能的工作流程是:

  1. 以二进制模式读入文件。
  2. 解码为 utf-8(或任何需要的编码)。
  3. 检测 EOL 样式。
  4. 将所有行尾转换为\n.

  5. 对文件做一些事情。

  6. 将所有行尾转换为原始样式。

  7. 编码文件。
  8. 以二进制模式写入文件。

在此工作流程中,执行第 2 步的最佳方法是什么?

4

2 回答 2

15

要保留原始行尾,请使用newline=''读取或写入未翻译的行尾。

with open('test.txt','r',newline='') as rf:
    content = rf.read()
content = content.replace('old text','new text')
with open('testnew.txt','w',newline='') as wf:
    wf.write(content)

请注意,如果文本操作本身处理行尾,则可能需要附加或替代逻辑来检测和匹配原始行尾。

'U'模式也有效,但已弃用。

Python 文档:打开

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

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

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

于 2018-06-22T23:08:50.243 回答
11

使用 python 的通用换行支持

f = open('randomthing.py', 'rU')
fdata = f.read()
newlines = f.newlines
print repr(newlines)

newlines如果文件使用混合分隔符,则包含文件的分隔符或分隔符元组。

于 2011-02-28T16:09:19.243 回答