【问题标题】:Python - archiving file before moving to another directory? [duplicate]Python - 在移动到另一个目录之前归档文件? [复制]
【发布时间】:2014-12-01 15:54:46
【问题描述】:

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

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"

那么我如何在将文件移动到另一个目录之前存档(或压缩)文件(不管是 zip 还是 tar.gz)? (原始文件应该只处于归档状态,而不是像手动归档时,它会保留原始文件未归档)

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

示例

初始化状态

src/dir/

里面的文件:

file1.xls, file2.xls

archive/dir

里面的文件:没有

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

最终状态

src/dir/

里面的文件:没有

archive/dir

里面的文件:

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

【问题讨论】:

  • 我不明白我在问什么不是很清楚?...简单的问题。如何在将文件移动到另一个目录之前存档文件(zip、gzip),以便它会出现在存档的目录中。
  • 那么任何人都可以把我的那个例子的简单代码示例?:)

标签: python file python-2.7


【解决方案1】:

如果您要做的只是将一个文件放入每个存档中,那么存档就没有任何意义。

或者你的意思是压缩它们,例如使用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 文件。

使用例如压缩单个文件压缩包:

import gzip

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

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

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

【讨论】:

  • 好吧,我认为存档和压缩是同义词。好吧,我的意思不是归档目录,而是压缩文件,然后将它们移动到另一个目录。
  • @Andrius:不,他们不是。 Zip 两者都做,tar 只压缩档案,gzip/bzip2/xz 只压缩。 .tar.gz 是 tar 和 gzip 的组合。
  • 好的,那么我真的推荐使用 gzip 或 bz2 模块。 gzip 更快,但压缩更差。 bz2 速度较慢,但​​压缩效果更好。通常的约定是将压缩文件命名为<originalFileName>.gzip... .bz2
  • ...当然最好使用lzma,但是python 2.7对于那个模块来说太旧了。
【解决方案2】:

标准库包含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 将源文件的内容复制到存档。

【讨论】:

    猜你喜欢
    • 2022-11-22
    • 2018-11-24
    • 1970-01-01
    • 1970-01-01
    • 2017-02-14
    • 1970-01-01
    • 2017-07-20
    • 1970-01-01
    • 2014-11-07
    相关资源
    最近更新 更多