Python:如何不带目录将文件放入归档?

15 投票
1 回答
16171 浏览
提问于 2025-04-16 23:16

我学习Python大约有3周了,现在正在尝试写一个小脚本,用来根据文件名中的关键词和日期对大约10,000个文件进行排序。那些在指定日期之前的文件应该被放到一个归档文件里。排序的部分运行得很好,但归档的部分却有点问题。

归档文件是创建成功了,名字也没问题,但归档里却包含了文件的完整路径。如果我打开它,里面的内容看起来像这样:folder1 -> folder2 -> folder3 -> files

我该怎么做才能让归档里只包含文件,而不是整个文件夹结构呢?

下面是我用来压缩文件的代码片段,node是文件在排序之前的路径,folder是一个子文件夹,里面是按名称中的关键词排序的文件,items是按日期排序的文件夹。

我使用的是Python 2.6

def ZipFolder(node, zipdate):
    xynode = node + '/xy'
    yznode = node + '/yz'
    for folder in [xynode,yznode]:
        items = os.listdir(folder)
        for item in items:
            itemdate = re.findall('(?<=_)\d\d\d\d-\d\d', item)
            print item
            if itemdate[0] <= zipdate:
                arcname = str(item) + '.zip'
                x = zipfile.ZipFile(folder + '/' + arcname, mode='w', compression = zipfile.ZIP_DEFLATED)
                files = os.listdir(folder + '/' + item)
                for f in files:
                    x.write(folder + '/' + item + '/' + f)
                    print 'writing ' + str(folder + '/' + item + '/' + f) + ' in ' + str(item)
                x.close()
                shutil.rmtree(folder + '/' + item)
    return

我也欢迎任何建议和改进。

1 个回答

21

来自帮助文档(zipfile):

 |  write(self, filename, arcname=None, compress_type=None)
 |      Put the bytes from filename into the archive under the name
 |      arcname.

所以试着把你的write()调用改成:

x.write(folder + '/' + item + '/' + f, arcname = f)

关于你的代码,我觉得已经挺不错了,特别是对于一个学习了3周的Python新手来说,不过如果能加一些注释就更好了 ;-)

撰写回答