2010-11-14 64 views
0

我想在將它作爲類文件對象獲取之前,先用Python驗證tar文件中存在給定文件。我試過isreg(),但可能我做錯了什麼。如何使用Python檢查tar檔案中是否存在文件?

如何檢查文件是否存在於使用Python的tar存檔中?

我試圖

import tarfile 


tar = tarfile.open("sample.tar", "w") 
tar.add("test1.txt") 
tar.add("test2.txt") 
tar.add("test3.py") 
tar.close() 

tar = tarfile.open("sample.tar", "r") 
tai = tar.tarinfo(name="test3.py") 
print(tai.isreg()) 
print(tai.size()) 
tar.close() 

大概是錯誤的。實際上tai.size()總是0.

回答

0

也許用getnames()

tar = tarfile.open('sample.tar','r') 
if 'test3.py' in tar.getnames(): 
    print 'test3.py is in sample.tar' 
3

如果你真的需要檢查,那麼你可以測試使用getnames方法和in運營商成員:

>>> import tarfile 
>>> tar = tarfile.open("sample.tar", "w") 
>>> "sample.tar" in tar.getnames() 
True 

但是,我認爲,在Python(和處理文件系統一般),優先考慮例外情況。嘗試讀取和捕獲異常會更好,因爲事情總是會在檢查文件的存在和稍後閱讀之間發生。

>>> try: 
...  tar.getmember('contents.txt') 
... except KeyError: 
...  pass 
... 
0

您可以使用tar.getnames()in運營商做到這一點:

$ touch a.txt 
$ tar cvf a.tar a.txt 
$ python 
>>> names = tarfile.open('a.tar').getnames() 
>>> 'a.txt' in names 
True 
>>> 'b.txt' in names 
False 
0

這符合即使tar文件在一個子目錄中的文件名,並使用normcase模仿的文件名辦案當前的操作系統(例如在Windows上,搜索「readme.txt」應該與tar文件中的「README.TXT」匹配)。

def filename_in_tar(filename, atarfile): 
    filename= os.path.normcase(filename) 
    return any(
     filename == os.path.normcase(os.path.basename(tfn)) 
     for tfn in atarfile.getnames()) 
相關問題