使用 Python 处理 \n 与 ^M\n 换行符

Handling \n vs ^M\n newlines with Python

我正在解析一个包含键值对的文件,如下所示:

with open(filename) as f:
    data = f.read()
    key_value_pairs = data.split(";\n")

然后有一天,交付的文件有一个不同的行终止符,有人将处理它的行更改为:

key_value_pairs = data.split(";^M\n")

找到一个答案 解释 ^M 是一个 MS-DOS 现象。

然后this answer声称Windows终止符是\r\n,没有提到^M\n

作为背景信息,将提到该列表 key_value_pairs 中的每个元素在另一个循环中进一步拆分 .split("=", 1)

我希望未来的文件在有或没有 ^M 的情况下都具有不可预测的行终止,并试图找到一种方法来处理它,如果可以避免的话,没有混乱的正则表达式或字符串方法。

也许最好的办法就是在开始时将每个 ^M 从文件中剥离出来,然后将它们全部视为 Unix 文件。但是,对于文件中的某些 base64 二进制块,这可能有点危险。

Python 中有什么东西可以在文件打开时干净地处理那些 ^M 吗?

正如您的link所说,^M是ASCII字符13,Python应该读作\r

您可以简单地通过使用 re.split:

解析可选的 \r 来完成此操作
import re

data = 'split;\ntest;\r\nhere;\nanother;\r\nyay'

key_value_pairs = re.split(r';\r?\n', data)

# ['split', 'test', 'here', 'another', 'yay']

但是,如果是文字字符^M,则使用re.split(r';\^M\n|;\n', data):

data = 'split;\ntest;^M\nhere;\nanother;^M\nyay'

key_value_pairs = re.split(r';\^M\n|;\n', data)

# ['split', 'test', 'here', 'another', 'yay']