Rで解析:パスワード付きZIPも作成可能「zip」パッケージの紹介
ファイルの受け渡しやバックアップに欠かせないZIP圧縮ですが、R標準のzip関数は外部のzipプログラムに依存しており、OSや環境によって使えなかったり挙動が変わったりすることがありました。本記事で紹介する「zip」パッケージは、外部ツールを一切必要とせず、Windows・macOS・Linuxでも同じコードの書き方でZIPアーカイブの作成・展開ができるパッケージです。AES暗号化によるパスワード付きZIPの作成や、メモリ上のデータを直接圧縮・展開するdeflate / inflateコマンドにも対応しています。
パッケージバージョンは3.0.0。Windows 11 x64 (build 26200)のR version 4.6.1で確認しています。
パッケージのインストール
下記コマンドを実行してください。
# パッケージのインストール
install.packages("zip")
# パッケージの読み込み
library("zip")コマンド例
詳細はコメント、パッケージのヘルプを確認してください。
ZIPアーカイブへのファイル圧縮と追加:zipコマンドとzip_appendコマンド
複数のファイルをzipにまとめたり、既存のzipにファイルを追加することが可能です。password引数を指定するとパスワード付きZIPも作成できます。
| オプション | 意味 | 初期値 |
|---|---|---|
| zipfile | 作成するZIPファイルのパスを指定。既存の場合、zip()は上書きし、zip_append()は追記する | |
| files | アーカイブに追加するファイルのパスを文字ベクトルで指定。絶対パス・相対パスいずれも指定可 | |
| recurse | ディレクトリの内容を再帰的に追加するかどうかを指定 | TRUE |
| compression_level | 圧縮レベルを1〜9の数値で指定。9が最も高圧縮だが処理時間も長い | 9 |
| include_directories | アーカイブにディレクトリを明示的に含めるかどうかを指定。docxファイル作成時はMS Officeとの互換性のためFALSEにする | TRUE |
| root | アーカイブ作成前に作業ディレクトリをここに変更する | “.” |
| mode | アーカイブ内でのファイル・ディレクトリの格納方法を指定。”mirror”(ディレクトリ構造を保持)または”cherry-pick”(指定ファイルを直下に格納)から選択 | c(“mirror”, “cherry-pick”) |
| keys | filesと同じ長さの文字ベクトルで、アーカイブ内での格納パスを個別指定。NULLの場合はmodeに従って決定される | NULL |
| password | 暗号化用パスワード。文字列・バイトベクトル・関数のいずれかを指定可能。NULL(既定)の場合はzip_passwordオプションを参照し、それも未設定なら暗号化しない | NULL |
| encryption | “aes256″(既定)または”aes128″はWinZip AES暗号化方式を使用し、7-Zip・WinZip・macOS Archive Utilityと互換性がある。”zipcrypto”は互換性維持のための旧式方式でセキュリティが低いため推奨されない | c(“aes256”, “aes128”, “zipcrypto”) |
### 準備 #####
# 一時ディレクトリを作成
dir.create(tmp <- tempfile())
# サブディレクトリを作成
dir.create(file.path(tmp, "mydir"))
# ファイル1を作成
cat("first file", file = file.path(tmp, "mydir", "file1"))
# ファイル2を作成
cat("second file", file = file.path(tmp, "mydir", "file2"))
# ZIPファイルのパスを作成し、変数に代入する
zipfile <- tempfile(fileext = ".zip")
########
# mydirをzipに圧縮:zipコマンド
zip(zipfile, "mydir", root = tmp)
# zipファイルの中身をリスト表示する
zip_list(zipfile)
### zipにファイルを追加 #####
# ファイル3を作成
cat("third file", file = file.path(tmp, "mydir", "file3"))
# zipに新しいファイルを追加する:zip_appendコマンド
zip_append(zipfile, file.path("mydir", "file3"), root = tmp)
# 追加後のzipファイルの中身をリスト表示する
zip_list(zipfile)
### 応用:パスワード付きZIPの作成 #####
# パスワード付きZIPファイルのパスを作成し、変数に代入する
zipfile_pw <- tempfile(fileext = ".zip")
# AES-256暗号化のパスワード付きzipを作成する:zipコマンド
zip(zipfile_pw, "mydir", root = tmp, password = "pass1234")実行結果:
> # zipファイルの中身をリスト表示する
> zip_list(zipfile)
# A data frame: 3 × 9
filename compressed_size uncompressed_size timestamp permissions crc32 offset type encryption
<chr> <dbl> <dbl> <dttm> <octmode> <hexmo> <dbl> <chr> <chr>
1 mydir/ 0 0 2026-07-13 12:12:34 700 000000… 0 dire… none
2 mydir/file1 15 10 2026-07-13 12:12:34 600 00effe… 36 file none
3 mydir/file2 16 11 2026-07-13 12:12:34 600 735af9… 108 file none
> # 追加後のzipファイルの中身をリスト表示する
> zip_list(zipfile)
# A data frame: 4 × 9
filename compressed_size uncompressed_size timestamp permissions crc32 offset type encryption
<chr> <dbl> <dbl> <dttm> <octmode> <hexmo> <dbl> <chr> <chr>
1 mydir/ 0 0 2026-07-13 12:12:34 700 000000… 0 dire… none
2 mydir/file1 15 10 2026-07-13 12:12:34 600 00effe… 36 file none
3 mydir/file2 16 11 2026-07-13 12:12:34 600 735af9… 108 file none
4 mydir/file3 15 10 2026-07-13 12:12:38 600 b0bf9f… 181 file none zipファイルの解凍とファイル抽出:unzipコマンド
zipファイルを指定したディレクトリに解凍します。files引数を使うとアーカイブ内の特定のファイルだけを抽出することも可能です。
| オプション | 意味 | 初期値 |
|---|---|---|
| zipfile | 解凍するZIPファイルのパス、または複数パスの文字ベクトル | |
| files | ZIPファイルから抽出するファイルを文字ベクトルで指定。パス区切りは / を使用する。NULLはすべて抽出 | NULL |
| overwrite | 既存ファイルを上書きするかどうかを指定。FALSEで既存ファイルがあるとエラーになる | TRUE |
| junkpaths | すべてのディレクトリパスを無視してexdir直下にファイルを作成するかどうかを指定 | FALSE |
| exdir | 展開先のディレクトリ(存在しない場合は作成される) | “.” |
| encoding | ZIPファイル内のファイル名のエンコーディングを指定。UTF-8フラグ付きエントリは常にUTF-8として解釈され、それ以外のエントリにこの値が使われる。NULL(既定)はIBM CP437にフォールバックする | NULL |
| password | 暗号化エントリの復号用パスワード。文字列・生ベクトル・関数のいずれかを指定可能。NULL(既定)の場合はzip_passwordオプションを参照し、それもなければパスワードなしとして扱う | NULL |
### 準備 #####
# 一時ディレクトリを作成
dir.create(tmp <- tempfile())
# サブディレクトリを作成
dir.create(file.path(tmp, "mydir"))
# ファイル1を作成
cat("first file", file = file.path(tmp, "mydir", "file1"))
# ファイル2を作成
cat("second file", file = file.path(tmp, "mydir", "file2"))
# ZIPファイルのパスを作成し、変数に代入する
zipfile <- tempfile(fileext = ".zip")
# mydirをzipに圧縮:zipコマンド
zip(zipfile, "mydir", root = tmp)
########
# 抽出用の一時ディレクトリを作成する
tmp2 <- tempfile()
# zipファイルを指定した場所に展開する
result <- unzip(zipfile, exdir = tmp2)
# 結果データセットのファイル名とパスを表示する
result[, c("filename", "path")]
# 応用:特定のファイルのみを抽出する(パス区切りは / を使用)
unzip(zipfile, files = "mydir/file1", exdir = tempfile())実行結果:
> # 結果データセットのファイル名とパスを表示する
> result[, c("filename", "path")]
# A data frame: 3 × 2
filename path
<chr> <chr>
1 mydir/ "\\\\?\\C:\\Users\\hogehoge\\AppData\\Local\\Temp\\RtmpOMupzX\\file6d645ea9…
2 mydir/file1 "\\\\?\\C:\\Users\\hogehoge\\AppData\\Local\\Temp\\RtmpOMupzX\\file6d645ea9…
3 mydir/file2 "\\\\?\\C:\\Users\\hogehoge\\AppData\\Local\\Temp\\RtmpOMupzX\\file6d645ea9…
<おすすめのRに関する書籍です>
外部圧縮プロセスの作成と完了確認:zip_processコマンド
外部プロセスを介したzip作成処理を行うオブジェクトを作成し、Rのセッションをブロックせずに大規模な圧縮タスクを実行できます。processx::processのサブクラスとして実装されているため、利用にはprocessxパッケージが必要です。
| オプション | 意味 | 初期値 |
|---|---|---|
| zipfile | 作成するZIPファイルのパスを指定 | |
| files | アーカイブに追加するファイルのパスを文字ベクトルで指定。指定したファイル・ディレクトリはアーカイブの最上位エントリとして格納される | |
| recurse | ディレクトリの内容を再帰的に追加するかどうかを指定 | TRUE |
| include_directories | アーカイブにディレクトリを明示的に含めるかどうかを指定。docxファイル作成時はMS Officeとの互換性のためFALSEにする | TRUE |
| poll_connection | processx::processのinitializeメソッドに渡され、processx::poll()やpoll_io()メソッドでプロセスの完了をポーリング可能にする | TRUE |
| stderr | processx::processのinitializeメソッドに渡される。既定では標準エラー出力を一時ファイルに書き出し、プロセス失敗時の原因調査に利用できる | tempfile() |
| … | processx::processのinitializeメソッドに渡される |
### 準備 #####
# 一時ディレクトリを作成
dir.create(tmp <- tempfile())
# irisデータを"iris.ssv"として保存する
write.table(iris, file = file.path(tmp, "iris.ssv"))
# ZIPファイルのパスを作成し、変数に代入する
zipfile <- tempfile(fileext = ".zip")
########
# ZIP処理オブジェクトを初期化して圧縮する:zip_processコマンド
zp <- zip_process()$new(zipfile, tmp)
# 圧縮処理が完了するまで待機する
zp$wait()
# 圧縮処理の終了ステータス(成功:0/失敗:0以外)を取得する
zp$get_exit_status()
# 作成されたZIPファイルの中身をリスト表示する
zip_list(zipfile)実行結果:
> # 作成されたZIPファイルの中身をリスト表示する
> zip_list(zipfile)
# A data frame: 2 × 9
filename compressed_size uncompressed_size timestamp permissions crc32
<chr> <dbl> <dbl> <dttm> <octmode> <hex>
1 file6d64ade7… 0 0 2026-07-14 10:34:46 700 0000…
2 file6d64ade7… 1133 4969 2026-07-14 10:34:46 600 64a1…
# ℹ 3 more variables: offset <dbl>, type <chr>, encryption <chr>GZIP圧縮と展開:deflateコマンドとinflateコマンド
ファイルを介さず、メモリ上の生データ(rawベクトル)を直接圧縮・展開できます。base::memCompress()と似た機能ですが、入力から読み込んだバイト数(bytes_read)も取得できる点が特徴です。
deflateコマンドのオプション
| オプション | 意味 | 初期値 |
|---|---|---|
| buffer | 圧縮対象のデータを含む生ベクトル | |
| level | 圧縮レベルを1(最速)〜9(最高圧縮)の整数で指定 | 6L |
| pos | 圧縮対象データのバッファ内開始位置を指定 | 1L |
| size | 出力バッファの初期サイズ推定値またはNULL。指定なし、または小さすぎる場合は自動的に拡張される | NULL |
inflateコマンドのオプション
| オプション | 意味 | 初期値 |
|---|---|---|
| buffer | 展開対象のデータを含む生ベクトル | |
| pos | バッファ内の展開対象データの開始位置を指定 | 1L |
| size | 展開後のサイズ推定値またはNULL。指定なし、または小さすぎる場合は自動的に拡張される | NULL |
| raw | bufferがzlibヘッダー・トレーラーを持たない生のDEFLATEストリームかどうかを指定。既定のFALSEはzlibストリームを想定する | FALSE |
# テキストを圧縮したバイナリデータを生成する:deflateコマンド
# charToRawはRのBaseコマンド
data_gz <- deflate(charToRaw("Hello world!"))
# 圧縮結果(output:圧縮データ/bytes_read:読込バイト数/bytes_written:書込バイト数)を確認する
data_gz
# 圧縮されたデータを元のデータに復元して展開する:inflateコマンド
# rawToCharはRのBaseコマンド
rawToChar(inflate(data_gz$output)$output)実行結果:
> # 圧縮結果(output:圧縮データ/bytes_read:読込バイト数/bytes_written:書込バイト数)を確認する
> data_gz
$output
[1] 78 9c 00 0c 00 f3 ff 48 65 6c 6c 6f 20 77 6f 72 6c 64 21 00 00 00 ff ff
$bytes_read
[1] 12
$bytes_written
[1] 24
> # 圧縮されたデータを元のデータに復元して展開する:inflateコマンド
> rawToChar(inflate(data_gz$output)$output)
[1] "Hello world!"
この記事が誰かの役に立ちますように。