python中压缩文件的正确方法

python中压缩文件的正确方法,python,zip,Python,Zip,我试图通过从一个特定的目录压缩两个文本文件来创建一个zip文件。我的代码如下所示: import zipfile,os project='C:/Users/user1/Documents/work/filesToZip' dirlist = os.listdir(project) print dirlist zip_name = zipfile.ZipFile(os.path.join(project,'jobs.zip'),'w') for file in dirlist: zip

我试图通过从一个特定的目录压缩两个文本文件来创建一个zip文件。我的代码如下所示:

import zipfile,os

project='C:/Users/user1/Documents/work/filesToZip'

dirlist = os.listdir(project)
print dirlist
zip_name = zipfile.ZipFile(os.path.join(project,'jobs.zip'),'w')
for file in dirlist:
    zip_name.write(os.path.join(project,file))

zip_name.close()
代码运行良好,它创建了zip文件,唯一的问题是当我打开zip文件时,我发现整个目录结构都被压缩了。i、 当我打开文件时,我会发现用户打开它,然后是用户1打开它,然后是文档打开它,然后是工作,然后是文件tozip,然后我会找到我想要压缩的文件。我的问题是,我如何才能得到红色的文件结构,所以当我打开压缩文件时,我会立即找到我压缩的文件


提前谢谢

对于python 2.7+,您可以改为使用:


通过这种方式,您可以明确指定哪个目录应该是
根目录
,哪个目录应该是
基目录
。如果
root\u dir
base\u dir
不相同,它将只压缩
base\u dir
中的文件,但保留目录结构,直到
root\u dir

对于python 2.7+,您可以使用:

import zipfile,os

project='C:/Users/user1/Documents/work/filesToZip'
original_dir= os.getcwd()
os.chdir(project)
dirlist = os.listdir(".")
print dirlist
zip_name = zipfile.ZipFile('./jobs.zip','w')
for file in dirlist:
    zip_name.write('./'+file)

zip_name.close()
os.chdir(original_dir)

通过这种方式,您可以明确指定哪个目录应该是
根目录
,哪个目录应该是
基目录
。如果
root\u dir
base\u dir
不相同,它将只压缩
base\u dir
中的文件,但保留目录结构,直到
root\u dir

ZipFile.write
已完成
import zipfile,os

project='C:/Users/user1/Documents/work/filesToZip'
original_dir= os.getcwd()
os.chdir(project)
dirlist = os.listdir(".")
print dirlist
zip_name = zipfile.ZipFile('./jobs.zip','w')
for file in dirlist:
    zip_name.write('./'+file)

zip_name.close()
os.chdir(original_dir)
这正是你想要的

import zipfile,os

project='C:/Users/user1/Documents/work/filesToZip'

# prevent adding zip to itself if the old zip is left in the directory
zip_path = os.path.join(project,'jobs.zip')
if os.path.exists(zip_path):
    os.unlink(zip_path);

dirlist = os.listdir(project)

zip_file = zipfile.ZipFile(zip_path, 'w')
for file_name in dirlist:
    zip_file.write(os.path.join(project, file_name), file_name)
zip_file.close()

ZipFile.write
这正是你想要的

import zipfile,os

project='C:/Users/user1/Documents/work/filesToZip'

# prevent adding zip to itself if the old zip is left in the directory
zip_path = os.path.join(project,'jobs.zip')
if os.path.exists(zip_path):
    os.unlink(zip_path);

dirlist = os.listdir(project)

zip_file = zipfile.ZipFile(zip_path, 'w')
for file_name in dirlist:
    zip_file.write(os.path.join(project, file_name), file_name)
zip_file.close()

这不是问题,这不是问题,支持ZipFile吗?或者只是焦油替代品?这支持ZipFile吗?或者只是tar替代品?谢谢你的回复,但是你的解决方案解决了一个问题,即它将zip文件与其他文件一起压缩。因此,在最后,我们将有一个压缩文件压缩在另一个one@user1762447除非目录中有旧的zip文件,否则这是不可能的。”jobs.zip'是在
listdir
之后创建的,因此它不在
dirlist
中,也不会添加到存档中。如果运行两次,Joran的解决方案将显示相同的行为。我将在我的答案中添加
os.unlink
。@robyschek你说得对!我再试了一次,效果很好,我只是在你的答案中添加了zip_file.close()。谢谢感谢您的回复,但您的解决方案解决了一个问题,即它将zip文件与其他文件一起压缩。因此,在最后,我们将有一个压缩文件压缩在另一个one@user1762447除非目录中有旧的zip文件,否则这是不可能的。”jobs.zip'是在
listdir
之后创建的,因此它不在
dirlist
中,也不会添加到存档中。如果运行两次,Joran的解决方案将显示相同的行为。我将在我的答案中添加
os.unlink
。@robyschek你说得对!我再试了一次,效果很好,我只是在你的答案中添加了zip_file.close()。谢谢要学究气,需要将
chdir
s之间的代码包装在
try+finally
@robyschek。。。但是你的答案还是比较好的,我不想太迂腐,chdirs之间的代码需要包装在
try+finally
@robyschek中。。。但你的答案无论如何都比我好