本文へスキップ
からだにいいもの

Rのトピックスを中心に『まだ、まだ、知らない、役に立つ情報?』を発信します。

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”)
keysfilesと同じ長さの文字ベクトルで、アーカイブ内での格納パスを個別指定。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ファイルのパス、または複数パスの文字ベクトル
filesZIPファイルから抽出するファイルを文字ベクトルで指定。パス区切りは / を使用する。NULLはすべて抽出NULL
overwrite既存ファイルを上書きするかどうかを指定。FALSEで既存ファイルがあるとエラーになるTRUE
junkpathsすべてのディレクトリパスを無視してexdir直下にファイルを作成するかどうかを指定FALSE
exdir展開先のディレクトリ(存在しない場合は作成される)“.”
encodingZIPファイル内のファイル名のエンコーディングを指定。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…

外部圧縮プロセスの作成と完了確認:zip_processコマンド

外部プロセスを介したzip作成処理を行うオブジェクトを作成し、Rのセッションをブロックせずに大規模な圧縮タスクを実行できます。processx::processのサブクラスとして実装されているため、利用にはprocessxパッケージが必要です。

オプション意味初期値
zipfile作成するZIPファイルのパスを指定
filesアーカイブに追加するファイルのパスを文字ベクトルで指定。指定したファイル・ディレクトリはアーカイブの最上位エントリとして格納される
recurseディレクトリの内容を再帰的に追加するかどうかを指定TRUE
include_directoriesアーカイブにディレクトリを明示的に含めるかどうかを指定。docxファイル作成時はMS Officeとの互換性のためFALSEにするTRUE
poll_connectionprocessx::processのinitializeメソッドに渡され、processx::poll()やpoll_io()メソッドでプロセスの完了をポーリング可能にするTRUE
stderrprocessx::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
rawbufferが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!"


この記事が誰かの役に立ちますように。

スポンサーリンク
価格および配送状況は変更される場合があります。購入時は商品ページをご確認ください。
当サイトに表示されている商品情報はAmazonから提供されたものであり、更新または削除される場合があります。
karada-goodはAmazonアソシエイトとして、適格販売により収入を得ています。