【发布时间】:2017-04-06 16:34:52
【问题描述】:
我正在使用 Python 2.7 逐行比较两个文本文件,忽略:
- 不同的行尾('\r\n' vs '\n')
- 文件末尾的空行数
下面是我的代码。它适用于第 2 点,但不适用于第 1 点。我正在比较的文件可能很大,所以我正在逐行阅读它们。请不要推荐 zip 或类似的库。
def compare_files_by_line(fpath1, fpath2):
# notice the opening mode 'r'
with open(fpath1, 'r') as file1, open(fpath2, 'r') as file2:
file1_end = False
file2_end = False
found_diff = False
while not file1_end and not file2_end and not found_diff:
try:
# reasons for stripping explained below
f1_line = next(file1).rstrip('\n')
except StopIteration:
f1_line = None
file1_end = True
try:
f2_line = next(file2).rstrip('\n')
except StopIteration:
f2_line = None
file2_end = True
if f1_line != f2_line:
if file1_end or file2_end:
if not (f1_line == '' or f2_line == ''):
found_diff = True
break
else:
found_diff = True
break
return not found_diff
您可以测试此代码未能满足第 1 点。通过为其提供 2 个文件,其中一个文件的行以 UNIX 换行符结尾
abc\n
另一个以 Windows 换行符结尾的行
abc\r\n
我在每次比较之前去掉了结束行字符以说明第 2 点。这解决了两个文件包含一系列相同行的问题,即使一个文件以空行,而另一行没有。
根据this answer,以“r”模式(而不是“rb”)打开文件应该注意特定于操作系统的行尾,并将它们全部读取为“\n”。这不会发生。
我怎样才能使这项工作将行尾 '\r\n' 视为 '\n' 结尾?
我正在使用 Python 2.7.12 和 Anaconda 发行版 4.2.0。
【问题讨论】:
标签: python python-2.7 newline string-comparison