R用lapply、list.files批量导入txt、csv文件报invalid 'description'错误如何解决
R批量导入txt/csv文件报错"Error in file(file, "rt") : invalid 'description' argument"的原因与解决办法
报错产生原因
- 路径参数设置错误:
list.files函数中你设置了full.names = FALSE,该参数为FALSE时仅返回无路径前缀的纯文件名,若R当前工作目录和数据文件的实际存储目录不匹配,文件读写函数无法定位到目标文件,就会抛出路径无效的错误。 - 文件匹配规则错误:你写的
pattern = ".txt|csv"是不符合需求的正则表达式:.在正则语法中代表任意字符,且你没有锚定文件名末尾,会误匹配所有文件名中包含txt、csv连续字符的文件,最终得到的文件列表可能和你预期的5个txt+1个csv的数量、排序完全不符。 - 硬编码取文件索引的风险:你直接用
data[1:5]取txt文件、data[6]取csv文件,但list.files返回的文件名默认按字典序排序,不一定符合你预期的顺序;如果匹配到的文件总数不足6个,data[6]会返回NA值,传入读写函数就会直接触发该报错。
解决方法
- 修正
list.files的参数,将full.names设为TRUE,获取文件的完整绝对路径,彻底避免工作目录不匹配的问题 - 修正正则匹配规则,改为
pattern = "\\.(txt|csv)$":\\.转义后匹配后缀名前的点,$锚定文件名末尾,只会匹配后缀为txt、csv的文件 - 放弃硬编码索引取文件,改为按后缀筛选文件,避免文件排序不符合预期的问题
修正后的可运行代码
# 获取所有符合要求的txt、csv文件的完整路径 all_data_files <- list.files(getwd(), pattern = "\\.(txt|csv)$", full.names = TRUE, recursive = FALSE) # 按后缀分别筛选txt和csv文件 txt_file_list <- all_data_files[grepl("\\.txt$", all_data_files)] csv_file_list <- all_data_files[grepl("\\.csv$", all_data_files)] # 批量读入所有txt文件 data_appli <- lapply(txt_file_list, read.table, header = TRUE, dec = ".", sep = "\t", quote = "\n", skip = 0) # 读入csv文件并追加到列表(如果有多个csv也可以用lapply批量读) GEU <- read.csv2(csv_file_list[1], row.names = 1, stringsAsFactors = TRUE) data_appli[[length(data_appli) + 1]] <- GEU
调试小技巧:运行读文件代码前可以先打印
txt_file_list和csv_file_list,确认匹配到的文件数量、文件名和你预期的一致,避免误匹配冗余文件。
内容的提问来源于stack exchange,提问作者Yabi Abdou
相关产品推荐
相关产品推荐

