2013-10-08 51 views
0

我正在嘗試創建python腳本來存檔和壓縮datewise tar文件中的一年前數據。腳本還生成存檔文件的日誌文件。我在linux上使用python 2.6。tarfile.open每次覆蓋該文件

這裏是我的代碼:

for search_date in dd_list: 
    tar_file = "/files/yearly_archive/nas_archive_" + search_date + ".tgz" 
    mytar = tarfile.open(tar_file,"w:gz") 
    log_file = "/files/yearly_archive/archive_log_" + search_date 
    fcount = 0 
    #print tar_file 
    #print log_file 
    f = open(log_file,'ab+') 
    for f_name, d_date in date_file_dict.iteritems(): 
     if d_date == search_date: 
      #print f_name 
      fcount += 1 
      mytar.add(f_name) 
      f.write(f_name + '\n') 
    date_occur_dict[search_date] = fcount 
    mytar.close() 
    f.close() 

這裏登錄,如果它存在,但tar文件被覆蓋掉了每次當我運行該腳本文件得到追加。有沒有一種方法可以確保tar文件被附加,如果它存在,否則會被創建?

編輯:

我試圖爲ungzipping和添加添加代碼,但它無法正常工作。

for search_date in dd_list: 
    tar_file = "/files/yearly_archive/nas_archive_" + search_date + ".tgz" 
    zip = 1 
    try: 
     with open(tar_file,'ab+'): 
      import gzip 
      d_tar = gzip.open(tar_file,'wb') 
      zip = 0 
    except IOError: 
     print "Creating new tar file" 
    if zip == 1: 
     mytar = tarfile.open(tar_file,"w:gz") 
    else: 
     mytar = tarfile.open(d_tar,"w") 
    log_file = "/files/yearly_archive/archive_log_" + search_date 
    fcount = 0 
    #print tar_file 
    #print log_file 
    f = open(log_file,'ab+') 
    for f_name, d_date in date_file_dict.iteritems(): 
     if d_date == search_date: 
      #print f_name 
      fcount += 1 
      mytar.add(f_name) 
      f.write(f_name + '\n') 
    date_occur_dict[search_date] = fcount 
    mytar.close() 
    f.close() 

我收到以下錯誤:

Traceback (most recent call last): 
    File "sort_archive.py", line 63, in <module> 
    mytar = tarfile.open(d_tar,"w") 
    File "/usr/lib64/python2.6/tarfile.py", line 1687, in open 
    return cls.taropen(name, mode, fileobj, **kwargs) 
    File "/usr/lib64/python2.6/tarfile.py", line 1697, in taropen 
    return cls(name, mode, fileobj, **kwargs) 
    File "/usr/lib64/python2.6/tarfile.py", line 1518, in __init__ 
    fileobj = bltn_open(name, self._mode) 
TypeError: coercing to Unicode: need string or buffer, instance found 

回答

1

不能使用tarfile追加到壓縮的壓縮包。分別執行解壓縮/壓縮步驟,或者不要首先使用壓縮。

+0

你的意思是將文件解壓之前,然後用tarfile.open(tar_file, 「A」)追加tar文件? – user2501825

+0

Ungzipping,但是。 –

+0

我有懷疑ungzipping和追加。當我們用gzip.open打開文件時,文件名會保持不變嗎?如果我用gzip打開後添加文件,它會去tar嗎? – user2501825

0

<刪除線>

你嘗試改變模式?我看到w,它明顯覆蓋了文件。嘗試使用a或w +。

mytar = tarfile.open(tar_file,"w+:gz") 

mytar = tarfile.open(tar_file,"a:gz") 

< /刪除線>

+1

像[文檔](http://docs.python.org/2/library/tarfile.html)說,你不能用'':''或'':bz2''使用''a'',和「w +」無效。 –