2017-10-06 91 views
1

我正在通过比较文件名来查找重复文件。python中的字符串比较

但是,我发现os.walk返回的一些路径包含转义字符。例如,对于一个文件,我可能得到structure in the Earth\'s core.pdf,另一个文件可能得到structure in the Earth\xe2\x80\x99s core.pdf

In [1]: print 'structure in the Earth\'s core.pdf\nstructure in the Earth\xe2\x80\x99s core.pdf' 
structure in the Earth's core.pdf 
structure in the Earth’s core.pdf 

In [2]: 'structure in the Earth\'s core.pdf' == 'structure in the Earth\xe2\x80\x99s core.pdf' 
Out[2]: False 

我该如何处理这些情况?

==== 只是为了澄清的Q回应的意见,也有其他的情况下重复文件,如含有较多的空间比分隔其他

  • 一个文件名

    • 一个文件名-而其他含有日本/中国话:
    • 一个文件名和其他的数字和日本/中国单词组成...
  • +0

    它们是两个不同的字符......'''不等于'''。您将一个替换为另一个,或仅比较给定句子的字母数字。 – kaza

    +1

    它们不是*相同*,因为它们使用不同的编码来创建相同的_general_视觉外观。 C.F. [this](https://stackoverflow.com/questions/32761954/how-to-decode-an-ascii-string-with-backslash-x-codes)链接进行类似的讨论。它们是@bulbus笔记中的不同字符。解决这个问题非常复杂,因为它会打开一堆蠕虫,说明有多少种可能的方式来表达一些智力相似但却不完全相同的东西。 –

    +0

    您可以尝试将它们翻译为“字典”表示法,在比较和编写报告之前剥离所有非字母数字。 –

    回答

    1

    也许你可以得到字符串的相似性,而不是完全匹配。由于诸如大写等简单的事情,获得​​完全匹配可能会有问题。

    我建议如下:

    from difflib import SequenceMatcher 
    
    s1 = "structure in the Earth\'s core.pdf" 
    s2 = "structure in the Earth\xe2\x80\x99s core.pdf" 
    
    matcher = SequenceMatcher() 
    matcher.set_seqs(s1, s2) 
    print(matcher.ratio()) 
    # 0.9411764705882353 
    

    这一结果表明,这两个串之间的相似性超过94%。您可以定义一个阈值以删除或在删除之前查看项目。