2015-01-16 46 views
6

我有一個python腳本,可以壓縮文件new.txt。python:zip文件,並避免目錄結構

tofile = "/root/files/result/"+file 
targetzipfile = new.zip # This is how I want my zip to look like 
zf = zipfile.ZipFile(targetzipfile, mode='w') 
try: 
     #adding to archive 
     zf.write(tofile) 
finally: 
     zf.close() 

當我這樣做時,我得到了zip文件。但是當我嘗試解壓縮文件時,我在與該文件路徑對應的一系列目錄中獲得文本文件,即在「結果」目錄中看到一個名爲「root」的文件夾以及其中更多的目錄。

即。我有/root/files/result/new.zip,當我解壓new.zip 我有一個看起來像

/root/files/result/root/files/result/new.txt. 

有沒有一種方法,我可以壓縮,這樣當我解壓我只得到new.txt的目錄結構。

換句話說,我有/root/files/result/new.zip,當我解壓new.zip,它應該看起來像

/root/files/results/new.txt 

回答

7

zipfile.write()方法有一個可選的參數arcname指定的文件名應該是壓縮文件裏面有什麼

我認爲你需要對目標進行修改,否則會重複目錄。使用:arcname來避免它。嘗試這樣的:

import os 
import zipfile 

def zip(src, dst): 
    zf = zipfile.ZipFile("%s.zip" % (dst), "w", zipfile.ZIP_DEFLATED) 
    abs_src = os.path.abspath(src) 
    for dirname, subdirs, files in os.walk(src): 
     for filename in files: 
      absname = os.path.abspath(os.path.join(dirname, filename)) 
      arcname = absname[len(abs_src) + 1:] 
      print 'zipping %s as %s' % (os.path.join(dirname, filename), 
             arcname) 
      zf.write(absname, arcname) 
    zf.close() 

zip("src", "dst") 
4

退房的文檔Zipfile.write

ZipFile.write(文件名[,arcname [,compress_type])寫入文件 命名文件名到存檔,給它存檔名稱arcname(由 默認情況下,這將是相同的文件名,但沒有驅動器號 並去掉前面的路徑分隔符)

https://docs.python.org/2/library/zipfile.html#zipfile.ZipFile.write

嘗試以下操作:

import zipfile 
import os 
filename = 'foo.txt' 

# Using os.path.join is better than using '/' it is OS agnostic 
path = os.path.join(os.path.sep, 'tmp', 'bar', 'baz', filename) 
zip_filename = os.path.splitext(filename)[0] + '.zip' 
zip_path = os.path.join(os.path.dirname(path), zip_filename) 

# If you need exception handling wrap this in a try/except block 
with zipfile.ZipFile(zip_path, 'w') as zf: 
    zf.write(path, zip_filename) 

底線是,如果您不提供存檔名稱,則文件名將用作存檔名稱,並且它將包含該文件的完整路徑。

0

爲了最清楚地說明,

目錄結構:

/Users 
└── /user 
. ├── /pixmaps 
. │ ├── pixmap_00.raw 
. │ ├── pixmap_01.raw 
     │ ├── /jpeg 
     │ │ ├── pixmap_00.jpg 
     │ │ └── pixmap_01.jpg 
     │ └── /png 
     │   ├── pixmap_00.png 
     │   └── pixmap_01.png 
     ├── /docs 
     ├── /programs 
     ├── /misc 
     . 
     . 
     . 

感興趣目錄:/用戶/用戶/像素圖

首先學嘗試

import os 
import zipfile 

TARGET_DIRECTORY = "/Users/user/pixmaps" 
ZIPFILE_NAME = "CompressedDir.zip" 

def zip_dir(directory, zipname): 
    """ 
    Compress a directory (ZIP file). 
    """ 
    if os.path.exists(directory): 
     outZipFile = zipfile.ZipFile(zipname, 'w', zipfile.ZIP_DEFLATED) 

     for dirpath, dirnames, filenames in os.walk(directory): 
      for filename in filenames: 

       filepath = os.path.join(dirpath, filename) 
       outZipFile.write(filepath) 

     outZipFile.close() 




if __name__ == '__main__': 
    zip_dir(TARGET_DIRECTORY, ZIPFILE_NAME) 

ZIP文件結構:

CompressedDir.zip 
. 
└── /Users 
    └── /user 
      └── /pixmaps 
       ├── pixmap_00.raw 
       ├── pixmap_01.raw 
       ├── /jpeg 
       │ ├── pixmap_00.jpg 
       │ └── pixmap_01.jpg 
       └── /png 
        ├── pixmap_00.png 
        └── pixmap_01.png 

避免完整的目錄路徑

def zip_dir(directory, zipname): 
    """ 
    Compress a directory (ZIP file). 
    """ 
    if os.path.exists(directory): 
     outZipFile = zipfile.ZipFile(zipname, 'w', zipfile.ZIP_DEFLATED) 

     # The root directory within the ZIP file. 
     rootdir = os.path.basename(directory) 

     for dirpath, dirnames, filenames in os.walk(directory): 
      for filename in filenames: 

       # Write the file named filename to the archive, 
       # giving it the archive name 'arcname'. 
       filepath = os.path.join(dirpath, filename) 
       parentpath = os.path.relpath(filepath, directory) 
       arcname = os.path.join(rootdir, parentpath) 

       outZipFile.write(filepath, arcname) 

    outZipFile.close() 




if __name__ == '__main__': 
    zip_dir(TARGET_DIRECTORY, ZIPFILE_NAME) 

ZIP文件結構:

CompressedDir.zip 
. 
└── /pixmaps 
    ├── pixmap_00.raw 
    ├── pixmap_01.raw 
    ├── /jpeg 
    │ ├── pixmap_00.jpg 
    │ └── pixmap_01.jpg 
    └── /png 
      ├── pixmap_00.png 
      └── pixmap_01.png 
0
zf.write(tofile) 

改變

zf.write(tofile, zipfile_dir) 

例如

zf.write("/root/files/result/root/files/result/new.txt", "/root/files/results/new.txt")