如何获取文件内容的相同部分?

时间:2013-10-04 06:22:44

标签: python

我有两个文件,我想在屏幕中显示文件1和文件2中存在的内容。但它似乎没有任何显示(但它应显示オレンジ)。有什么问题?

感谢

File 1

リンゴ
バナナ
オレンジ

File 2

オレンジ

这是我的代码

import sys

File1 = open(sys.argv[1],"r",encoding="UTF-8")
F1_Content = File1.readlines()
F1_Content = map(lambda e : e.rstrip("\n"),F1_Content)

File2 = open(sys.argv[2],"r",encoding="UTF-8")
F2_Content = File2.readlines()
F2_Content = map(lambda e : e.rstrip("\n"),F2_Content)

for line in F1_Content:
    print(repr(line))
    if line in F2_Content:
        print(line)

File1.close()
File2.close()   

输出

'\ufeff
''
''

1 个答案:

答案 0 :(得分:2)

您可能在其中一个文件中有更多的空格而不仅仅是换行符。您可以循环F1_ContentF2_Content,使用print(repr(line))print(line.encode('unicode_escape'))打印该行的表示,以便更轻松地发现线条不同。

我完全剥离线条。另外,对一个文件的行使用set,测试将 更高效:

with open(sys.argv[1], "r") as file1:
    f1_content = {line.strip() for line in file1}

with open open(sys.argv[2], "r") af file2:
    for line in file2:
        if line.strip() in file2:
            print(line)

直接在文件上循环,逐行读取文件,让您无需将整个文件读入内存即可处理文件行。

另请注意此处使用with语句;文件对象是上下文管理器,当上下文关闭(with块结束)时,文件对象会自动关闭。

使用片假名,你的一个文件也可能使用ZI字符的分解而另一个不使用;您可以将其表示为\u30B8 作为\u30B7\u3099; (SI + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK):

>>> print('\u30B8 != \u30B7\u3099:', '\u30B8' != '\u30B7\u3099')
ジ != ジ: True

您可以使用unicodedata.normalize()将所有行规范化为合成或分解形式。在这里,我强制所有数据使用组合形式:

from unicodedata import normalize

with open(sys.argv[1], "r") as file1:
    f1_content = {normalize(line.strip(), 'NFKC') for line in file1}

with open open(sys.argv[2], "r") af file2:
    for line in file2:
        if normalize(line.strip(), 'NFKC') in file2:
            print(line)