2014-11-03 125 views
0

正如你可以看到這是非常非常笨重。我將如何去自動檢測文件擴展名?自動檢測文件擴展名

txt_files = glob('*txt') 
png_files = glob('*.png') 
jpg_files = glob('*.jpg') 
zip_files = glob('*.zip') 
gif_files = glob('*.gif') 
iso_files = glob('*iso') 
epub_files = glob('*epub') 
ico_files = glob('*.ico') 

#Unimportant bit to question 

for n in txt_files: 
    move_files(n, 'txt') 
for n in png_files: 
    move_files(n, 'png') 
for n in jpg_files: 
    move_files(n, 'jpg') 
for n in zip_files: 
    move_files(n, 'zip') 
for n in gif_files: 
    move_files(n, 'gif') 
for n in iso_files: 
    move_files(n, 'iso') 
for n in epub_files: 
    move_files(n, 'epub') 
for n in ico_files: 
    move_files(n, 'ico') 
+0

是否有原因,你的一些擴展有'.',有些不? – abarnert 2014-11-03 20:20:32

回答

3

爲「自動檢測新的擴展名」,只是經過所有文件,並看看他們的擴展:

for f in os.listdir(): 
    name, ext = os.path.splitext(f) 
    ext = ext.lstrip('.') 
    if ext: 
     os.mkdirs(ext) 
     move_file(filename, ext) 

請注意,如果你的一些「擴展」的實際上不是這樣的擴展將無法正常工作。我注意到您現有的代碼搜索諸如*txt*iso之類的東西,這當然會匹配諸如this_is_not_txtspam.aniso等之類的東西。如果這是一個必需的功能,而不是一個錯誤,那麼你必須爲你的「擴展」所指的內容制定一些規則,然後才能在代碼中實現它...

另請注意,沒有擴展名的文件因爲那if ext:),並且有一個空的擴展名(只是.)的文件也將是(因爲if檢查發生在lstrip之後)。如果需要,你當然可以改變其中的任何一種(儘管你需要提出一個子目錄名稱,它不可能與任何可能的實際擴展模糊不清......)。

最後,這不會處理「雙擴展」 - 例如,.tar.gz文件將與.gz進入同一目錄。同樣,如果需要,這很容易改變。

+1

可能值得注意的是沒有「。」的文件。擴展名將被忽略。 – martineau 2014-11-03 20:28:26

+0

@martineau:好的,我不確定這是否有必要,但我已經添加了它,謝謝。 – abarnert 2014-11-03 20:39:50

0
for ext in "txt png jpg zip gif iso epub ico".split(): 
    for file in glob("*.%s"%ext): #if there are no files of this type it just skips it 
     move_files(file,ext) 

可能?它不是很清楚你的問題是什麼

從某種意義上說,這是「自動檢測」以後如果有適合的模式中不存在的文件將跳過move_files一步

+0

這是如何「自動檢測新的擴展名」?這只是一種更緊湊的方式來編寫他已有的邏輯(除了''''只在'txt'中包含)。 – abarnert 2014-11-03 20:22:48

+0

是的,我不知道他的意思是什麼......我只是在說他的陳述「正如你所看到的,這是非常非常困難的。」 (我認爲他的意思很笨拙......但他並沒有詳細說明它的笨拙) – 2014-11-03 20:24:50

+1

你是對的,這有點含糊不清。我想他可能意味着他想清理這些代碼,然後在最後寫一些額外的代碼來檢測移動後的剩餘擴展(例如'unexpected_extensions = {os.path.splitext(f)[1] f in os.listdir()if os.path.isfile(f)}')? – abarnert 2014-11-03 20:26:31