12章学習記録 » 履歴 » バージョン 1
Tatsuya ISHIGAKI, 2025/07/25 03:03
| 1 | 1 | Tatsuya ISHIGAKI | ## 12.3 tar ファイルを扱う tarfile |
|---|---|---|---|
| 2 | gzip, bz2, lzma 形式で圧縮されたものを含む、tar 形式アーカイブを読み書きする |
||
| 3 | |||
| 4 | - tar ファイルを操作する |
||
| 5 | - 関数 `open(name=None, mode='r', fileobj=None, bufsize=20240, **kwargs)` |
||
| 6 | - `name` tar ファイルのファイル名 |
||
| 7 | - `mode` モード指定 `r` `w` 等 |
||
| 8 | - 圧縮形式を指定する場合は `r:gz` `w:xz` 等 (非圧縮指定は `w:` 等) |
||
| 9 | - 読み込み時は `r` だけでも、ファイル名拡張子から圧縮形式が自動判定される |
||
| 10 | - 圧縮ファイルは追記モードが使用できない (`a` `a:` のみ) |
||
| 11 | - `fileobj` tar ファイルのファイルオブジェクト |
||
| 12 | - `bufsize` ブロックサイズ (デフォルトでよい) |
||
| 13 | - **戻り値** `tarfile.TarFile` |
||
| 14 | - 関数 `is_tarfile(name)` |
||
| 15 | - `name` ファイル名、または file-like オブジェクト |
||
| 16 | - **戻り値** (bool) 指定ファイルが tar 形式アーカイブなら True |
||
| 17 | - `TarFile` オブジェクトのメソッド |
||
| 18 | |||
| 19 | |メソッド名|解説|戻り値| |
||
| 20 | |---|---|---| |
||
| 21 | |`getnames()`|tar ファイル内にアーカイブされているファイル名リスト|list| |
||
| 22 | |`getmember(name)`|指定ファイル名の `TarInfo` を返す|TarInfo| |
||
| 23 | |`getmembers()`|tar ファイル内にアーカイブされている全ファイルの `TarFile` のリストを返す|list| |
||
| 24 | |`extract(member, path="", set_attrs=True, *, numeric_owner=False)`|指定ファイルを指定場所へ展開<br>`member`:ファイル名または`TarInfo`|None| |
||
| 25 | |`extractall(path="", set_attrs=True, *, numeric_owner=False)`|全ファイルを指定場所へ展開|None| |
||
| 26 | |`extractfile(member)`|指定ファイルを開き、ファイルオブジェクトを返す<br>`member`:ファイル名または`TarInfo`|ファイルオブジェクト| |
||
| 27 | |`add(name, arcname=None, recursive=True, exclude=None, *, filter=None)`|指定ファイルを tar ファイルのアーカイブへ追加する<br>`arcname`を指定するとそのファイル名で追加<br>ディレクトリ指定では再帰追加可能|?| |
||
| 28 | |`close()`||None| |
||
| 29 | |||
| 30 | ```python |
||
| 31 | >>> import tarfile |
||
| 32 | >>> with tarfile.open("./testarchive.tar", "w:gz") as f: |
||
| 33 | ... f.add("./inArchive1.txt") |
||
| 34 | ... |
||
| 35 | >>> with tarfile.open("./testarchive.tar") as f: |
||
| 36 | ... f.getnames() |
||
| 37 | ... f.getmembers() |
||
| 38 | ... |
||
| 39 | ['./inArchive1.txt'] |
||
| 40 | [<TarInfo './inArchive1.txt' at 0x140b4104640>] |
||
| 41 | >>> with tarfile.open("./testarchive.tar") as f: |
||
| 42 | ... with f.extractfile("./inArchive1.txt") as elem: |
||
| 43 | ... elem.read().decode("sjis") |
||
| 44 | ... |
||
| 45 | 'アーカイブ内ファイル1' |
||
| 46 | >>> with tarfile.open("./testarchive.tar") as f: |
||
| 47 | ... info = f.getmember("./inArchive1.txt") |
||
| 48 | ... info |
||
| 49 | ... print(f"{info.name=}, {info.size=}, {info.mtime=}, {info.mode=:o}") |
||
| 50 | ... |
||
| 51 | <TarInfo './inArchive1.txt' at 0x140b4104940> |
||
| 52 | info.name='./inArchive1.txt', info.size=22, info.mtime=1753410842.0, info.mode=666 |
||
| 53 | >>> with tarfile.open("./testarchive.tar") as f: |
||
| 54 | ``` |