使用 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']
我正在解析一个包含键值对的文件,如下所示:
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']