2017-10-06 86 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%。您可以定義一個閾值以刪除或在刪除之前查看項目。