プロジェクト

全般

プロフィール

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
    ```