2015-01-15 33 views
0

我明顯在做一些非常錯誤的事情。我想找到文件,這是在一個目錄,但不是在第二個目錄(例如xxx.phn在一個目錄和xxx.wav在第二個目錄...Python:檢測現有文件:os.file.exists

似乎我無法檢測,當文件不存在第二個目錄(它總是像顯示所有文件)...我沒有得到任何文件顯示,儘管它們的存在......

import shutil, random, os, sys 

if len(sys.argv) < 4: 
    print """usage: python del_orphans_dir1_dir2.py source_folder source_ext dest_folder dest_ext 
      """ 
    sys.exit(-1) 

folder = sys.argv[1] 
ext = sys.argv[2] 
dest_folder = sys.argv[3] 
dest_ext = sys.argv[4] 
i = 0 

for d, ds, fs in os.walk(folder): 
    for fname in fs: 
     basename = os.path.splitext(fname)[0] 
     if (not os.path.exists(dest_folder+'/'+basename + '.' + dest_ext)): 
      print str(i)+': No duplicate for: '+fname 
      i=i+1  

print str(i)+' files found' 
+0

FWIW沒有必要做'str(i)'調用。只要做'打印我',找到文件''。而'i + = 1'而不是'i = i + 1'的作品。 – Joel

+3

如果'os.path.exists'不能正常工作,爲什麼你需要多於一行或兩行來演示相同?擁有額外的代碼只是創建其他地方(與'os.path.exists'無關),該錯誤可能會隱藏。 –

+1

同樣,爲您的打印語句重新計算全名並再次爲實際的exists()調用表示它們之間可能存在細微的差異。理想情況下,像這樣的問題會在打印輸出中顯示「ls -l」,表明該文件存在,並在腳本中顯示一條錯誤消息,表明它不會,並且會爲打印呼叫使用僅分配一次的變量和'exists()'調用,以避免出現此類錯誤。 –

回答

1

我可以建議你讓你的文件名」再看着檢查,並檢查它是否存在之前打印出來..

dest_fname = dest_folder+'/'+basename + '.' + dest_ext 
print "dest exists? %s" % dest_fname 
os.path.exists(dest_fname) 

另外一個請在旁邊使用join()方法加入路徑。 (如果你真的想要沒有前導路徑元素的basename有一個basename()函數)。

+2

不,['os.walk'](https://docs.python.org/3.4/library/os.html#os.walk)不能這樣工作:'fname'將永遠是文件名,而不是路徑。在任何情況下,OPs代碼都在測試文件*是否存在,但是對每個文件都計算爲「False」。這就是爲什麼最終輸出是「找到0個文件」(即沒有找到重複文件)的原因。 – ekhumoro

+0

真的..我會編輯出誤導的東西。我仍然認爲他應該打印他正在尋找的路徑。可能更多的是一個評論比現在的答案.. –

+0

感謝你們所有人的幫助...現在似乎工作... – user2064070

0

我試過你的程序,它適用於兩個簡單的平面目錄。以下是目錄內容:

a\a.txt 
a\b.txt  # Missing from b directory 
a\c.txt 
b\a.csv 
b\c.csv 

而且隨着a txt b csv作爲參數腳本的結果。如果你的結果不同,也許你使用了不同的參數?

0: No duplicate for: b.txt 
1 files found 

但是,當我加入子目錄:

a\a.txt 
a\b.txt  # Missing from b directory 
a\c.txt 
a\c\d.txt 
a\c\e.txt # Missing from b\c directory 
b\a.csv 
b\c.csv 
b\c\d.csv 

您的腳本給:

0: No duplicate for: b.txt 
1: No duplicate for: d.txt  # Error here 
2: No duplicate for: e.txt 
3 files found 

不同,需要計算相對於源目錄的路徑子目錄工作,然後將其添加到目標目錄。以下是其他一些小清理和打印的結果,以瞭解發生了什麼。需要注意的是fname永遠只是文件名,並需要與d結合,以獲得整個路徑:

#!python2 
import os, sys 

if len(sys.argv) < 4: 
    print """usage: python del_orphans_dir1_dir2.py source_folder source_ext dest_folder dest_ext 
      """ 
    sys.exit(-1) 

folder = sys.argv[1] 
ext = sys.argv[2] 
dest_folder = sys.argv[3] 
dest_ext = sys.argv[4] 
i = 0 

for d, ds, fs in os.walk(folder): 
    for fname in fs: 
     relpath = os.path.relpath(os.path.join(d,fname),folder) 
     relbase = os.path.splitext(relpath)[0] 
     path_to_check = os.path.join(dest_folder,relbase+'.'+dest_ext) 
     if not os.path.exists(path_to_check): 
      print '{}: No duplicate for: {}, {} not found.'.format(i,os.path.join(folder,relpath),path_to_check) 
      i += 1 

print i,'files found' 

輸出:

0: No duplicate for: a\b.txt, b\b.csv not found. 
1: No duplicate for: a\c\e.txt, b\c\e.csv not found. 
2 files found 
0

你在做什麼是尋找被匹配的文件,不重複的。一個問題是你在搜索時沒有使用source_ext參數。另一種是我認爲命令行參數處理是混亂的。下面是一個修正後的版本,它可以完成你想要做的事情:

import os 
import sys 

if len(sys.argv) != 5: 
    print("usage: python " 
      "del_orphans_dir1_dir2.py " # argv[0] (script name) 
      "source_folder "    # argv[1] 
      "source_ext "    # argv[2] 
      "dest_folder "    # argv[3] 
      "dest_ext")     # argv[4] 
    sys.exit(2) # command line error 

source_folder, source_ext, dest_folder, dest_ext = sys.argv[1:6] 
dest_ext = dest_ext if dest_ext.startswith('.') else '.'+dest_ext # check dot 

found = 0 
for d, ds, fs in os.walk(source_folder): 
    for i, fname in enumerate(fs, start=1): 
     basename, ext = os.path.splitext(fname) 
     if ext == source_ext: 
      if os.path.exists(os.path.join(dest_folder, basename+dest_ext)): 
       found += 1 
      else: 
       print '{}: No matching file found for: {}'.format(i, fname) 

print '{} matches found'.format(found) 
sys.exit(0)