如何阻止easycsv::fread_zip自动保存解压文件?求替代方案
解决easycsv::fread_zip自动存文件到根目录的问题
方法一:给fread_zip指定临时解压目录
easycsv::fread_zip的源码里其实藏了个未在文档说明的exdir参数,用来指定解压路径。你可以把文件解压到系统临时目录,读完后清理,不会污染项目根目录:
require(easycsv) require(data.table) # 创建临时目录(系统会自动回收,也可手动删除) temp_dir <- tempdir() filezip <- system.file("exampleZips", "example_tables.zip", package="easycsv") # 指定解压到临时目录,读取数据 df <- fread_zip(filezip, exdir = temp_dir) # 手动清理临时目录里的解压文件(可选) unlink(file.path(temp_dir, list.files(temp_dir)), recursive = TRUE)
方法二:放弃easycsv,用原生工具更可控
直接用data.table::fread结合utils::unzip,完全不用把文件写到磁盘,直接在内存读取:
处理单个zip文件
require(data.table) filezip <- system.file("exampleZips", "example_tables.zip", package="easycsv") # 获取zip内的所有文件列表,筛选txt文件 zip_file_list <- unzip(filezip, list = TRUE)$Name txt_files <- grep("\\.txt$", zip_file_list, value = TRUE) # 逐个读取并合并成一个数据表 all_data <- rbindlist(lapply(txt_files, function(file) { fread(unz(filezip, file)) }))
批量处理多个zip文件
如果要处理多个zip文件,用purrr批量循环:
require(data.table) require(purrr) # 替换成你的zip文件所在目录 zip_folder <- "path/to/your/zip/files" # 获取所有zip文件的路径 all_zips <- list.files(zip_folder, pattern = "\\.zip$", full.names = TRUE) # 遍历所有zip,读取其中的txt文件并合并 all_data <- map_dfr(all_zips, function(zip_path) { zip_file_list <- unzip(zip_path, list = TRUE)$Name txt_files <- grep("\\.txt$", zip_file_list, value = TRUE) rbindlist(lapply(txt_files, function(file) { fread(unz(zip_path, file)) })) })
特殊情况:需要临时解压再读取
如果遇到编码问题必须先解压,还是用临时目录:
require(data.table) filezip <- system.file("exampleZips", "example_tables.zip", package="easycsv") temp_dir <- tempdir() # 解压到临时目录 unzip(filezip, exdir = temp_dir) # 读取所有txt文件 txt_paths <- list.files(temp_dir, pattern = "\\.txt$", full.names = TRUE) all_data <- rbindlist(lapply(txt_paths, fread)) # 删除临时文件 unlink(txt_paths)
内容的提问来源于stack exchange,提问作者Gino
相关产品推荐
相关产品推荐

