Python:将文件放入没有目录的存档中?

rny*_*rny 10 python zipfile

我现在已经学习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
Run Code Online (Sandbox Code Playgroud)

我也对任何建议和改进持开放态度.

rod*_*igo 15

来自帮助(zipfile):

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

因此,尝试使用以下命令更改write()调用:

x.write(folder + '/' + item + '/' + f, arcname = f)
Run Code Online (Sandbox Code Playgroud)

关于你的代码,在我看来它已经足够好了,特别是对于一个为期3周的pythonist,虽然有一些评论会受到欢迎;-)

  • 虽然@Springfield在技术上是不正确的,但使用它似乎更正确:`x.write(os.path.join(folder,item,f),arcname = f)`. (4认同)
  • 不是评论而是文档字符串。解释函数的作用和用途,而不是它是如何工作的,并且文档字符串对此最有用。 (2认同)
  • 摆脱那个丑陋的加入。x.write(文件夹, 项目, f, arcname = f, sep='/') (2认同)