我在一個項目中的蟒蛇,我需要只提取tar歸檔並不是所有的文件的子文件夾中工作的單一目錄。 我試圖用只提取焦油
tar = tarfile.open(tarfile)
tar.extract("dirname", targetdir)
但是,這並不工作,但不提取給定的子目錄也不會拋出異常。我是一名Python初學者。 此外,如果上述功能不適用於目錄工作什麼()這個命令和tar.extractfile之間的區別?
我在一個項目中的蟒蛇,我需要只提取tar歸檔並不是所有的文件的子文件夾中工作的單一目錄。 我試圖用只提取焦油
tar = tarfile.open(tarfile)
tar.extract("dirname", targetdir)
但是,這並不工作,但不提取給定的子目錄也不會拋出異常。我是一名Python初學者。 此外,如果上述功能不適用於目錄工作什麼()這個命令和tar.extractfile之間的區別?
大廈從tarfile module documentation第二個例子,你可以提取所包含的子文件夾和它的所有內容像這樣的東西:
with tarfile.open("sample.tar") as tar:
subdir_and_files = [
tarinfo for tarinfo in tar.getmembers()
if tarinfo.name.startswith("subfolder/")
]
tar.extractall(members=subdir_and_files)
這將創建子文件夾及其內容的列表,並然後使用推薦的extractall()
方法來提取它們。當然,將"subfolder/"
替換爲要提取的子文件夾的實際路徑(相對於tar文件的根目錄)。
對方回答將保留的子文件夾路徑,這意味着subfolder/a/b
將提取到./subfolder/a/b
。要提取一個子文件夾的根,所以subfolder/a/b
將被抽取到./a/b
,你可以像這樣重寫路徑:
def members(tf):
l = len("subfolder/")
for member in tf.getmembers():
if member.path.startswith("subfolder/"):
member.path = member.path[l:]
yield member
with tarfile.open("sample.tar") as tar:
tar.extractall(members=members(tar))
工程很棒。你也可以通過執行'member.path = os.path.join('new_dirname',member.path [l:]')來重命名這個樣式的頂層文件夾。 – Blake
extractfile()不將文件寫入磁盤,它只是給你一個python對象。 extract()寫入磁盤。 –