フォルダー内のすべてのコンテンツを圧縮するプログラムがあります。私はこのコードを書きませんでしたが、オンラインのどこかで見つけて使用しています。たとえば、 C:/folder1/folder2/folder3/ などのフォルダーを圧縮するつもりです。folder3 とそのすべての内容を folder3.zip というファイルに圧縮したいと思います。以下のコードでは、zip すると、folder3.zip の内容は folder1/folder2/folder3/and ファイルになります。パス全体を圧縮するのではなく、目的のサブフォルダー (この場合は 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 OSとpython 25を使用しています。python 2.7にはshutil make_archiveがあり、役立つことはわかっていますが、2.5で作業しているため、別のソリューションが必要です:-/