14

我有一堆文件。有些是 Unix 行尾,许多是 DOS。在切换行尾之前,我想测试每个文件以查看是否为 dos 格式。

我该怎么做?有我可以测试的标志吗?相似的东西?

4

7 回答 7

31

Python 可以自动检测文件中使用了哪种换行约定,这要归功于“通用换行模式”(Unewlines

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
于 2010-05-10T07:26:06.710 回答
9

您可以在字符串中搜索\r\n. 那是 DOS 风格的行尾。

编辑:看看这个

于 2010-05-09T18:23:06.307 回答
3

(仅限Python 2 :) 如果您只想读取 DOS 或 Unix 格式的文本文件,则可以使用:

print open('myfile.txt', 'U').read()

也就是说,Python 的“通用”文件阅读器将自动使用所有不同的行尾标记,将它们转换为“\n”。

http://docs.python.org/library/functions.html#open

(感谢手柄!)

于 2010-05-09T20:29:36.360 回答
2

作为一个完整的 Python 新手,只是为了好玩,我试图找到一些简单的方法来检查一个文件。这似乎有效:

if "\r\n" in open("/path/file.txt","rb").read():
    print "DOS line endings found"

编辑:根据 John Machin 的评论进行简化(无需使用正则表达式)。

于 2010-05-09T19:04:52.823 回答
0

使用 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$'  
于 2010-05-10T13:59:55.380 回答
0

dos 换行符\r\n,仅限unix \n。所以只需搜索\r\n.

于 2010-05-09T18:23:51.017 回答
0

您可以使用以下函数(应该在 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'
于 2019-04-30T20:45:10.663 回答