2017-08-11 264 views
0

我有從網站下載的zip文件。我想製作腳本來重命名zip文件,在解壓縮之前,它會檢查其中的文件數量並將其解壓縮。蟒蛇:解壓錯誤'沒有這樣的文件或目錄'

的問題是,zip文件所在的目錄,但它不斷給我錯誤 「FileNotFoundError:[錯誤2]沒有這樣的文件或目錄:「filename.zip」 我認爲這可能由以下原因造成文件名,因爲我使用的Ubuntu和當我下載文件,名稱被打破,因爲它不是英文。所以我將它改爲數字(例如:20176),但仍然出現此錯誤。我的腳本 路徑表示絕對路徑。

data_type = '{}{}'.format('201706', '.zip') 
    filename = [i for i in os.listdir('user/directory')] 
    filename.sort(key=lambda ctime: ctime[0]) 
    downloaded = str(filename[0]) 

    old = os.path.join('user/directory', downloaded) 
    new = os.path.join('user/directory', data_type) 
    os.rename(old, new) 

    zip = ZipFile(data_type) 
    archived_files = zip.namelist() 
    amount = len(archived_files) 

回答

0

讓我們假設在排序列表中的第一個文件名是myfile.txt的。您的代碼

old = os.path.join('user/directory', downloaded) 
new = os.path.join('user/directory', data_type) 
os.rename(old, new) 

重命名目錄列表中的第一個文件,用戶/目錄/ myfile.txt的(不,由於上述考慮,最古老的一個)用戶/目錄/ 201706.zip 。接下來的聲明然後試圖打開2010706.zip,這當然不存在。如果您嘗試

zip = ZipFile(new) 

遺憾的是沒有保證該文件實際上將是一個壓縮文件,所以操作可能會失敗,它應該工作。

其他一些需要考慮的要點,也許在其他問題:

我懷疑你是誤會了排序功能:雖然你似乎要排序的文件名上創建時間的列表,只需調用拉姆達的參數ctime沒有按這並不意味着Python會理解你的需求。如果只有編程語言有一個DWIM(「按照我的意思」的模式),生活將會變得如此簡單!

key參數sort是,sort函數調用一次進行排序的每個值,期待它返回一個「排序鍵」(即,表示在需要排序的位置的值)的功能。假設我把你的拉姆達並將其應用到文件名:

In [1]: ruth_lambda = lambda ctime: ctime[0] 

In [2]: ruth_lambda("MY_FILENAME.TXT") 
Out[2]: 'M' 

你可以看到你在文件名的第一個字母排序,我懷疑這是你真正想要的。但我們可以稍後再討論。

上格式化快速的注意:這本來是簡單的寫

data_type = '{}{}'.format(zipfile_name, '.zip') 

data_type = '{}.zip'.format(zipfile_name) 

最後,由於os.listdir返回一個列表,而不是

filename = [i for i in os.listdir('user/directory')] 

它更易於編寫

filename = os.listdir('user/directory') 

雖然額外的計算不會造成任何傷害。作爲初學者,你會發現隨着你的改進,你的舊代碼開始看起來非常笨重 - 不用擔心,這是一種常見的體驗!只要向前走,儘量不要重複舊的錯誤。

+0

我編輯的代碼。刪除一些不相關的代碼,並把字符串,而不是'路徑' – ruth

相關問題