我有一堆文件。有些是 Unix 行尾,许多是 DOS。在切换行尾之前,我想测试每个文件以查看是否为 dos 格式。
我该怎么做?有我可以测试的标志吗?相似的东西?
我有一堆文件。有些是 Unix 行尾,许多是 DOS。在切换行尾之前,我想测试每个文件以查看是否为 dos 格式。
我该怎么做?有我可以测试的标志吗?相似的东西?
Python 可以自动检测文件中使用了哪种换行约定,这要归功于“通用换行模式”(U
newlines
f = open('myfile.txt', 'U')
f.readline() # Reads a line
# The following now contains the newline ending of the first line:
# It can be "\r\n" (Windows), "\n" (Unix), "\r" (Mac OS pre-OS X).
# If no newline is found, it contains None.
print repr(f.newlines)
如果有的话,这会给出第一行(Unix、DOS 等)的换行符结尾。
正如 John M. 指出的那样,如果您有一个使用多个换行符编码的病态文件,f.newlines
那么在阅读了许多行之后,它是一个包含迄今为止发现的所有换行符编码的元组。
参考:http ://docs.python.org/2/library/functions.html#open
如果您只想转换文件,您可以简单地执行以下操作:
with open('myfile.txt', 'U') as infile:
text = infile.read() # Automatic ("Universal read") conversion of newlines to "\n"
with open('myfile.txt', 'w') as outfile:
outfile.write(text) # Writes newlines for the platform running the program
您可以在字符串中搜索\r\n
. 那是 DOS 风格的行尾。
编辑:看看这个
(仅限Python 2 :) 如果您只想读取 DOS 或 Unix 格式的文本文件,则可以使用:
print open('myfile.txt', 'U').read()
也就是说,Python 的“通用”文件阅读器将自动使用所有不同的行尾标记,将它们转换为“\n”。
http://docs.python.org/library/functions.html#open
(感谢手柄!)
作为一个完整的 Python 新手,只是为了好玩,我试图找到一些简单的方法来检查一个文件。这似乎有效:
if "\r\n" in open("/path/file.txt","rb").read():
print "DOS line endings found"
编辑:根据 John Machin 的评论进行简化(无需使用正则表达式)。
使用 grep 和 bash:
grep -c -m 1 $'\r$' file
echo $'\r\n\r\n' | grep -c $'\r$' # test
echo $'\r\n\r\n' | grep -c -m 1 $'\r$'
dos 换行符\r\n
,仅限unix \n
。所以只需搜索\r\n
.
您可以使用以下函数(应该在 Python 2 和 Python 3 中工作)来获取现有文本文件中使用的换行符表示。所有三种可能的类型都被识别。该函数只读取文件直到第一个换行符来决定。当您有较大的文本文件时,这会更快且内存消耗更少,但它不会检测到混合换行符结尾。
在 Python 3 中,您可以在写入文件时将此函数的输出传递给函数的newline
参数。open
这样,您可以更改文本文件的上下文而不更改其换行符表示。
def get_newline(filename):
with open(filename, "rb") as f:
while True:
c = f.read(1)
if not c or c == b'\n':
break
if c == b'\r':
if f.read(1) == b'\n':
return '\r\n'
return '\r'
return '\n'