Python:如何将文件打包成压缩文件而不保留文件夹?

15
我已经学习了Python约3周,目前正在尝试编写一个小脚本来按关键字和包含在文件名中的日期对文件(约10,000个)进行排序。在给定日期之前的文件应被添加到存档中。排序工作正常,但归档不起作用。
它创建了一个存档 - 名称很好 - 但在存档中是文件的完整路径。 如果我打开它,它看起来像: folder1-> folder2-> folder3-> files 。
如何更改使存档仅包含文件而不是整个结构?
下面是我的zip函数片段, 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

从 help(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)

就你的代码而言,我认为它还不错,尤其是对于一个学习Python三周的人来说。虽然一些注释会更受欢迎;-)


2
不是注释而是文档字符串。解释函数的功能以及它的用途,而不是它的工作原理,文档字符串对此非常有用。 - Jan Hudec
1
@Jan Hudec:您所说的文档字符串是指这样的东西:def ZipFolder(node, zipdate): """压缩“node”子文件夹中早于“zipdate”的文件""" - rny
2
摆脱那个丑陋的连接。x.write(folder, item, f, arcname=f, sep='/') - SpringField
@SpringField:那个函数不是print(),甚至不是file.write(),在文档中我也没有看到任何关于参数sep的参考。 - rodrigo
5
虽然@Springfield技术上是不正确的,但似乎更正确的做法是使用:x.write(os.path.join(folder,item,f),arcname=f) - tufelkinder
显示剩余9条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接