Python - 在移动到另一个目录之前归档文件?

时间:2014-10-07 09:01:05

标签: python file python-2.7

假设我有这个代码将文件移动到另一个目录中:

import os, shutil

    try:
        os.chdir(rec.gec_daily_dir)
        direct = os.listdir(/src/dir/)
        for f in direct:
            if f[-3:] == 'xls':
                shutil.move(f, /archive/dir/)
    except TypeError:
        print "Directory or file not found"

那么我怎样才能在将文件移动到antoher目录之前归档(或压缩)文件(与zip或tar.gz无关)? (原始文件应该只处于存档状态,而不是像手动存档时那样,它会保留原始文件的未存档状态)

我在那里看到了一个lib tarfile,你可以在那里做类似的事情,但是我看到了一些归档整个目录的例子,但我需要的是分别归档每个文件。

示例

初始状态

src/dir/
那里的

文件:

file1.xls, file2.xls

archive/dir

文件在那里:无

现在压缩文件并将它们移动到另一个目录:

最终状态

src/dir/

文件在那里:无

archive/dir
那里的

文件:

file1.zip, file2.zip (or .gz)

2 个答案:

答案 0 :(得分:2)

如果您要做的就是将一个文件放入每个档案中,档案馆就没有意义。

或者你的意思是压缩它们,例如使用gzipbz2模块?

如果您确实希望存档只包含一个文件,请创建一个tar或ZIP对象,然后立即添加它,例如TarFile.add

请注意,虽然在使用类似unix的操作系统使用bz2或gzip压缩单个文件时非常常见,但在其他平台上非常常见 un ,例如视窗。建议使用ZIP文件,即使是单个文件,因为应用程序(Windows资源管理器和其他人)可以很好地处理它们。

要将单个文件放入ZIP文件,请执行以下操作:

import zipfile
# ...

with zipfile.ZipFile(nameOfOrginalFile + ".zip", "w", zipfile.ZIP_DEFLATED) as zip_file:
    zip_file.write(nameOfOriginalFile)

不将ZIP_DEFLATED传递给ZipFile会导致未压缩的zip文件。

使用例如压缩单个文件gzip的:

import gzip

with gzip.GzipFile(nameoforiginalFile + ".gz", "w") as gz:
    with open(nameoforignalfile) as inp_file;
        shutil.copyfileobj(inp_file, gz)

bz2lzm a(不适用于Python 2)API相同,只需导入bz2 / lzma并使用bz2.BZ2File

在两个with块之后,您可以删除原始文件(os.remove(file))并将存档文件移动到正确的位置。或者,直接在正确的位置(os.path.join目标位置和存档名称)创建存档文件。

答案 1 :(得分:0)

标准库包含zipfile模块,用于处理.zip存档,gzip模块用于处理.gz压缩文件,bz2模块用于处理.bz2模块压缩文件(后者较慢,但产生更好的压缩)。

Python 3.3还引入了[lzma](适用于.xz.lzma文件),它具有更好的压缩率,但似乎没有向后移植到2.7。

请注意,单个文件不需要.tar.gz.gz也可以。因为.tar.gz是两个级别。 .tar将多个文件放在一起并.gz压缩它,如果只有一个,则不需要第一部分。 Zip完成这两件事,因此对于单个文件,它的效率略低于gz(它们使用相同的压缩方法),但您可能有一些工具可以理解zip文件而不是gz文件,因此可能有一些理由使用它。

要使用gzipbz2或[lzma]创建单个压缩文件,只需使用相应模块中的open函数,然后使用shutil。copyfileobj进行复制源文件的内容到存档。