gpt4 book ai didi

Python 压缩一个子文件夹而不是整个文件夹路径

转载 作者:太空狗 更新时间:2023-10-29 20:38:10 24 4
gpt4 key购买 nike

我有一个程序可以将所有内容压缩到一个文件夹中。我没有写这段代码,但我在网上的某个地方找到了它,我正在使用它。我打算压缩一个文件夹,例如 C:/folder1/folder2/folder3/。我想将 folder3 及其所有内容压缩到一个文件中,比如 folder3.zip。使用下面的代码,一旦我压缩它,folder3.zip 的内容将是 folder1/folder2/folder3/和文件。我不想压缩整个路径,我只想压缩我感兴趣的子文件夹(在本例中为 folder3)。我尝试了一些 os.chdir 等,但没有成功。

def makeArchive(fileList, archive):
"""
'fileList' is a list of file names - full path each name
'archive' is the file name for the archive with a full path
"""
try:
a = zipfile.ZipFile(archive, 'w', zipfile.ZIP_DEFLATED)

for f in fileList:
print "archiving file %s" % (f)
a.write(f)
a.close()
return True
except: return False

def dirEntries(dir_name, subdir, *args):
# Creates a list of all files in the folder
'''Return a list of file names found in directory 'dir_name'
If 'subdir' is True, recursively access subdirectories under 'dir_name'.
Additional arguments, if any, are file extensions to match filenames. Matched
file names are added to the list.
If there are no additional arguments, all files found in the directory are
added to the list.
Example usage: fileList = dirEntries(r'H:\TEMP', False, 'txt', 'py')
Only files with 'txt' and 'py' extensions will be added to the list.
Example usage: fileList = dirEntries(r'H:\TEMP', True)
All files and all the files in subdirectories under H:\TEMP will be added
to the list. '''

fileList = []
for file in os.listdir(dir_name):
dirfile = os.path.join(dir_name, file)
if os.path.isfile(dirfile):
if not args:
fileList.append(dirfile)
else:
if os.path.splitext(dirfile)[1][1:] in args:
fileList.append(dirfile)
# recursively access file names in subdirectories
elif os.path.isdir(dirfile) and subdir:
print "Accessing directory:", dirfile
fileList.extend(dirEntries(dirfile, subdir, *args))
return fileList

您可以通过 makeArchive(dirEntries(folder, True), zipname) 调用它。

关于如何解决这个问题有什么想法吗?我正在使用 Windows 操作系统和 python 25,我知道在 python 2.7 中有 shutil make_archive 这有帮助,但因为我正在使用 2.5,我需要另一个解决方案:-/

最佳答案

你必须给ZipFile.write()一个arcname参数使用相对路径。通过将要删除的根路径提供给 makeArchive() 来执行此操作:

def makeArchive(fileList, archive, root):
"""
'fileList' is a list of file names - full path each name
'archive' is the file name for the archive with a full path
"""
a = zipfile.ZipFile(archive, 'w', zipfile.ZIP_DEFLATED)

for f in fileList:
print "archiving file %s" % (f)
a.write(f, os.path.relpath(f, root))
a.close()

并调用它:

makeArchive(dirEntries(folder, True), zipname, folder)

我把毯子拿掉了 try:, except:;在这里没有用处,只能隐藏您想了解的问题。

os.path.relpath()函数返回相对于 root 的路径,有效地从存档条目中删除该根路径。

在 python 2.5 上,relpath 函数不可用;对于这个特定的用例,以下替换将起作用:

def relpath(filename, root):
return filename[len(root):].lstrip(os.path.sep).lstrip(os.path.altsep)

并使用:

a.write(f, relpath(f, root))

请注意,上述 relpath() 函数仅适用于您的特定情况,其中 filepath 保证以 root 开头;在 Windows 上,relpath() 的一般情况要复杂得多。如果可能的话,您确实希望升级到 Python 2.6 或更新版本。

关于Python 压缩一个子文件夹而不是整个文件夹路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14438928/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com