假设我有这个代码将文件移动到另一个目录中:
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)
答案 0 :(得分:2)
如果您要做的就是将一个文件放入每个档案中,档案馆就没有意义。
如果您确实希望存档只包含一个文件,请创建一个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)
bz2
和lzm
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文件,因此可能有一些理由使用它。
要使用gzip,bz2或[lzma]创建单个压缩文件,只需使用相应模块中的open
函数,然后使用shutil。copyfileobj进行复制源文件的内容到存档。