在python中处理文件时保留行尾样式

ami*_*tas 11 python line-endings

我正在寻找一种方法来确保在读取,编辑和编写时在python程序中维护文件的行尾样式.

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

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

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

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

  5. 做文件的东西.

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

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

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

sen*_*rle 11

使用python的通用换行支持:

f = open('randomthing.py', 'rU')
fdata = f.read()
newlines = f.newlines
print repr(newlines)
Run Code Online (Sandbox Code Playgroud)

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

  • 请注意...“允许使用额外的模式字符“U”,该字符不再具有任何效果,并且被视为已弃用。它以前在文本模式下启用通用换行符,这成为 Python 3.0 中的默认行为。请参阅有关更多详细信息,请参阅换行参数的文档。” (2认同)

小智 5

要保留原始行尾,请使用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)
Run Code Online (Sandbox Code Playgroud)

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

'U'模式也可以使用,但已弃用。

Python文档:打开

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

•从流中读取输入时,如果换行符为None,则启用通用换行符模式。输入中的行可以以'\n''\r'或结束'\r\n',并且'\n'在返回给调用方之前将其转换为行。如果为'',则启用通用换行模式,但是行结尾不翻译就返回给呼叫者。如果它具有任何其他合法值,则输入行仅由给定的字符串终止,并且该行的末尾未经转换返回给调用方。

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