在Python中处理文件时保持行尾风格
我想找一种方法,确保在用Python程序读取、编辑和写入文件时,文件的行结束符样式能够保持不变。
Python支持通用的文件结束符,这意味着在读取文件时,它会把所有的行结束符转换成\n
,然后在写入文件时再转换成系统默认的格式。对我来说,我希望在进行初始转换的同时,写入文件时能够保持原来的行结束符样式,而不是使用系统默认的。
有没有标准的方法可以做到这一点?如果没有,有没有标准的方法可以检测文件的行结束符样式?
假设没有标准的方法可以做到这一点,一个可能的工作流程是:
- 以二进制模式读取文件。
- 解码为utf-8(或者其他需要的编码)。
- 检测行结束符样式。
把所有的行结束符转换成
\n
。对文件进行操作。
把所有的行结束符转换回原来的样式。
- 对文件进行编码。
- 以二进制模式写入文件。
在这个工作流程中,第二步最好的做法是什么呢?
2 个回答
如果你想保留原始的换行符,可以在读取或写入时使用 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'
模式也可以使用,但已经不推荐了。
newline
控制通用换行模式的工作方式(这只适用于文本模式)。它可以是None
、''
、'\n'
、'\r'
和'\r\n'
。具体工作方式如下:• 当从流中读取输入时,如果
newline
是None
,那么通用换行模式就会启用。输入中的行可以以'\n'
、'\r'
或'\r\n'
结尾,这些都会在返回给调用者之前被转换成'\n'
。如果是''
,通用换行模式会启用,但换行符会原样返回给调用者,不会被翻译。 如果是其他合法值,输入行只会以指定的字符串结束,换行符也会原样返回给调用者。• 当向流中写入输出时,如果
newline
是None
,那么写入的任何'\n'
字符都会被转换为系统默认的换行符,具体可以查看 os.linesep。如果newline
是''
或'\n'
,则不会进行任何转换。 如果newline
是其他合法值,写入的任何'\n'
字符都会被转换为指定的字符串。
使用Python的通用换行符支持:
f = open('randomthing.py', 'rU')
fdata = f.read()
newlines = f.newlines
print repr(newlines)
newlines
里包含了文件的分隔符,如果文件使用了多种分隔符,它会是一个分隔符的元组。