我相对较新的python,我试图压缩目录包含几个级别的文件和文件夹。我可以使用函数每个文件的名字在我的目录,我可以使用zipfile zip平坦的文件在一个文件夹,但是我的时间努力压缩整个目录。我想zip文件称为"帮助。邮政",我想让它保留原始文件结构。我的一些尝试,这里是最新的:
- import zipfile, os
-
- def main():
- zip = "help3.zip"
- directory = "//groupstore/workgroups/documentation/test"
- toZip(directory)
-
-
- def toZip(directory):
- zippedHelp = zipfile.ZipFile(zip, "w", compression=zipfile.ZIP_DEFLATED )
-
- list = os.listdir(directory)
-
- for entity in list:
- each = os.path.join(directory,entity)
-
- if os.path.isfile(each):
- print each
- zippedHelp.write(each,zipfile.ZIP_DEFLATED)
- else:
- addFolderToZip(zippedHelp,entity)
-
- zippedHelp.close()
-
- #def addFolderToZip(zippedHelp,folder):
-
- for file in folder:
- if os.path.isfile(file):
- zippedHelp.write(file, os.path.basename(file), zipfile.ZIP_DEFLATED)
- elif os.path.isdir(file):
- addFolderToZip(zippedHelp,file)
- main()
-
# 回答1 这是另一个线程可能有关:http://bytes.com/forum/thread845051.html
# 回答2 我这里有一个脚本,该脚本使用备份的内容目录和子目录。它可以很容易地调整只备份的目录或文件内容与特定的扩展。保存在档案文件路径。
- import zipfile, os
-
- 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):
- '''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
-
- if __name__ == '__main__':
- folder = r'D:\Zip_Files\611 Lenox'
- zipname = r'D:\Zip_Files\611 Lenox\test.zip'
- makeArchive(dirEntries(folder, True), zipname)
-
HTH
# 回答4 谢谢你! !耶。我用你的脚本使我的工作和我得到更好的理解递归函数。这绝对是我的难题。再次感谢! !
# 回答5 @bvdet谢谢,这正是我一直在寻找在我pys60应用:D。再次感谢你的帮助:)
# 回答6 你也可以做到这一点,更简洁:
- def recursive_zip(zipf, directory, folder=None):
- list = os.listdir(directory)
-
- for file in list:
- if os.path.isfile(file):
- zipf.write(file, folder, zipfile.ZIP_DEFLATED)
- elif os.path.isdir(file):
- recursive_zip(zipf, os.path.join(directory, file), file)
# 回答7 Nakubu,谢谢你的贡献。发帖时请使用代码标记代码。这不是一个好主意列表和文件变量的名字。内置的功能列表()和文件()将蒙面,直到被删除的对象。我有一个问题。是zipf一个打开的文件对象?是很有帮助的其他阅读这个线程如果你想发布示例代码创建file对象,调用recursive_zip (),然后关闭文件对象。BV——主持人
# 回答8 这里有一个修订版本:
- def recursive_zip(zipf, directory, folder=None):
- nodes = os.listdir(directory)
-
- for item in nodes:
- if os.path.isfile(item):
- zipf.write(item, folder, zipfile.ZIP_DEFLATED)
- elif os.path.isdir(item):
- recursive_zip(zipf, os.path.join(directory, item), item)
-
-
zipf zipfile打开。ZipFile实例。例如:
- zipf = zipfile.ZipFile(zip, "w", compression=zipfile.ZIP_DEFLATED )
- path = '/Users/nakubu/some_folder'
- recursive_zip(zipf, path) //leave the first folder as None, as path is root.
- zipf.close()
-
# 回答9 我发现Nakubu的功能有帮助,但在很多方面需要修改它。希望这可以帮助别人:
- def recursive_zip(zipf, directory, folder = ""):
- for item in os.listdir(directory):
- if os.path.isfile(os.path.join(directory, item)):
- zipf.write(os.path.join(directory, item), folder + os.sep + item)
- elif os.path.isdir(os.path.join(directory, item)):
- recursive_zip(zipf, os.path.join(directory, item), folder + os.sep + item)
-
# 回答10 这些都是很好的,但恕我直言,操作系统。岩石和为你做困难的东西走。