在Python中处理文件时保持行尾风格

20 投票
2 回答
12735 浏览
提问于 2025-04-16 12:41

我想找一种方法,确保在用Python程序读取、编辑和写入文件时,文件的行结束符样式能够保持不变。

Python支持通用的文件结束符,这意味着在读取文件时,它会把所有的行结束符转换成\n,然后在写入文件时再转换成系统默认的格式。对我来说,我希望在进行初始转换的同时,写入文件时能够保持原来的行结束符样式,而不是使用系统默认的。

有没有标准的方法可以做到这一点?如果没有,有没有标准的方法可以检测文件的行结束符样式?

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

  1. 以二进制模式读取文件。
  2. 解码为utf-8(或者其他需要的编码)。
  3. 检测行结束符样式。
  4. 把所有的行结束符转换成\n

  5. 对文件进行操作。

  6. 把所有的行结束符转换回原来的样式。

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

在这个工作流程中,第二步最好的做法是什么呢?

2 个回答

24

如果你想保留原始的换行符,可以在读取或写入时使用 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 文档:open

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

• 当从流中读取输入时,如果 newlineNone,那么通用换行模式就会启用。输入中的行可以以 '\n''\r''\r\n' 结尾,这些都会在返回给调用者之前被转换成 '\n'如果是 '',通用换行模式会启用,但换行符会原样返回给调用者,不会被翻译。 如果是其他合法值,输入行只会以指定的字符串结束,换行符也会原样返回给调用者。

• 当向流中写入输出时,如果 newlineNone,那么写入的任何 '\n' 字符都会被转换为系统默认的换行符,具体可以查看 os.linesep如果 newline'''\n',则不会进行任何转换。 如果 newline 是其他合法值,写入的任何 '\n' 字符都会被转换为指定的字符串。

12

使用Python的通用换行符支持

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

newlines里包含了文件的分隔符,如果文件使用了多种分隔符,它会是一个分隔符的元组。

撰写回答