2017-08-11 260 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

相关问题