2016-08-30 477 views
1

我有一個文件夾結構爲:如何只壓縮文件夾內的文件而不壓縮子文件夾?

/sample/debug/ 
    --debug.exe 
    --sample.exe 
    --sample.pdb 
    --debug.pdb 
    --sample.dll 
    --debug.dll 
    /config 
     --sample.txt 
     --new.txt 
    /general 
     --general.txt 
     --code.txt 

所以,我要的是隻把拉鍊內部調試中的文件,而不是像子文件夾/配置和/一般。我試過如下:

import zipfile 
import os 

def append(dir_name): 
    ret_val = [] 
    fileList = [] 
    for file in os.listdir(dir_name): 
     try: 
      dirfile = os.path.join(dir_name, file) 
     except Exception: 
      err = sys.exc_info() 
      print ("Error!", err) 
     fileList.append(dirfile) 
     ret_val = fileList 
    return ret_val 

def zip(fileList, archive, root): 
    ret_val = 0 
    try: 
     zip_folder_contents = zipfile.ZipFile(archive, 'w', zipfile.ZIP_DEFLATED) 
    except Exception: 
     err = sys.exc_info() 
     print ("Error!",err) 
     exit(1) 
    for filename in fileList: 
     zip_folder_contents.write(filename, 
       filename[len(root):].lstrip(os.path.sep).lstrip(os.path.altsep)) 
    zip_folder_contents.close() 
    return ret_val 

make(append_files_in_zipfolder("D:/sample/debug"), "debug.zip", 
           "D:/sample/debug") 

現在,當我執行上面我得到錯誤的權限被拒絕「d:/樣品/調試\\配置」。因此,我無法刪除此錯誤,所以我認爲只包含zip文件夾內的文件並排除子文件夾。所以,無論如何,如何做到這一點,或者我可以刪除我得到的這種權限相關的錯誤。請建議。

+0

什麼是'make()'?函數'append_files_in_zipfolder()'的定義在哪裏? – martineau

+0

查看''''os'''模塊的[Files and Directories](https://docs.python.org/3/library/os.html#files-and-directories)部分,選擇一些方法將幫助你清除目錄,制定一些邏輯清除目錄,把它們放在一起並壓縮文件。 '''''''''''''可能會過度殺傷,但它可能會使它變得簡單。還有其他一些可以使其變得簡單/可能的其他方法。 – wwii

回答

2

你可以抓住一個文件夾中的所有文件,而無需使用進入子文件夾:

import os 
def getfilesfrom(directory): 
    return filter(lambda x: 
        not os.path.isdir(os.path.join(directory, x)), 
        os.listdir(directory)) 

# or alternatively, using generators (as suggested in the comments): 
def getfilesfrom(directory): 
    for x in os.listdir(directory): 
     if not os.path.isdir(os.path.join(directory, x)): 
      yield x # or yield os.path.join(directory, x) for full path. 

然後,您可以簡單地運行(如documentation描述):

import datetime 
import zipfile 

def print_info(archive_name): 
""" Print information from zip archive""" 
zf = zipfile.ZipFile(archive_name) 
for info in zf.infolist(): 
    print info.filename 
    print '\tComment:\t', info.comment 
    print '\tModified:\t', datetime.datetime(*info.date_time) 
    print '\tSystem:\t\t', info.create_system, '(0 = Windows, 3 = Unix)' 
    print '\tZIP version:\t', info.create_version 
    print '\tCompressed:\t', info.compress_size, 'bytes' 
    print '\tUncompressed:\t', info.file_size, 'bytes' 
    print 

print 'creating archive' 
zf = zipfile.ZipFile('debug.zip', mode='a', compression=zipfile.ZIP_DEFLATED) 
inputdir = '/sample/debug/' 
filestozip = getfilesfrom(inputdir) 
for afile in filestozip: 
    print('adding ' + afile + ' to zipfile debug.zip') 
    zf.write(os.path.join(inputdir, afile), afile) 

print 'closing' 
zf.close() 

print 
print_info('debug.zip') 
+0

我按照建議做了,但由於「系統找不到指定的文件」debug.exe而出現錯誤。在行'zf.write(afile)。 – newlearner

+0

如果你嘗試使用'zf.write(os.path.join(inputdir,afile))',它會解決這個問題嗎?剛剛編輯了代碼。我也將模式從「w''改爲」a'',否則在循環時會覆蓋文件。 – dangom

+0

我也這樣做了,但現在我得到了debug.zip文件夾,它已經壓縮了根目錄中的所有文件夾,即debug.zip包含從'/ sample /'根目錄開始的文件夾,但我不想要完整的目錄來壓縮。我只想要壓縮文件夾內的文件。我該怎麼做 – newlearner

0

下利用新的ZipFile上下文管理器可用:

from zipfile import ZipFile 

def zip_folder(zip_name, folder): 
    with ZipFile(zip_name, 'w') as myzip: 
     for entry in os.listdir(folder): 
      if os.path.isfile(entry): 
       myzip.write(os.path.join(folder, entry), arcname=entry) 

zip_folder(r'D:\output.zip', r'D:\sample\debug')