R语言批量加载多个CSV文件 如何移除对象名称中的.csv后缀
错误原因定位
你修改后的代码触发No such file or directory报错,核心是三个逻辑错位:
- 截取路径的长度计算完全错误:你对“基础目录路径+文件名”拼接的完整字符串做截取时,结束位置只算了原文件名的长度减4,完全没有把基础目录的长度纳入计算。举个例子:如果基础目录是
/home/project/data/(长度19),待读文件是user.csv(长度8),按照你的截取逻辑,最终取到的字符串长度是8-4=4,也就是从拼好的完整路径里只截前4个字符/hom,根本不是有效文件路径,自然找不到目标。 - 错把去后缀的操作用在了文件读取路径上:就算长度计算正确,你也不应该修改传给
read.csv的文件路径——磁盘上存的文件名是带.csv后缀的,去掉后缀后的路径根本对应不上实际文件。 assign()的赋值名称没有同步修改:就算路径读取逻辑正常,你传给赋值函数的第一个参数还是带.csv的原文件名,最终生成的R对象依旧会带后缀,完全达不到你的需求。
可直接运行的实现方案
基础循环版(适配你的原有代码逻辑)
调整去后缀操作的位置,只修改赋值的对象名,不改动实际读取的文件路径,同时用file.path替代手动字符串拼接,避免路径分隔符导致的读取失败:
for (i in seq_along(file_list)) { # 拼接真实的文件完整路径(供read.csv读取,保留.csv后缀) real_file_path <- file.path(base_dir, file_list[i]) # 去掉文件名末尾的.csv后缀,作为R环境中的对象名 target_obj_name <- sub("\\.csv$", "", file_list[i]) # 将读取到的数据赋值给无后缀的对象名 assign(target_obj_name, read.csv(real_file_path), envir = .GlobalEnv) }
这里用正则匹配替换去掉后缀,比手动按字符数截取更稳妥:如果后续碰到带多层后缀的文件,不会误截断文件名内容。
更高效的批量加载方案
相比往全局环境散落大量独立对象,更推荐把所有CSV读入一个命名列表中管理,后续批量做数据清洗、统计时不需要反复调用全局环境里的零散对象,代码可维护性更高:
# 生成和文件对应的无后缀名称 obj_names <- sub("\\.csv$", "", file_list) # 批量读取所有CSV,绑定对应名称 csv_dataset_list <- setNames( lapply(file.path(base_dir, file_list), read.csv), obj_names )
如果确实需要把列表中的对象单独释放到全局工作区,仅需一行代码即可完成:list2env(csv_dataset_list, envir = .GlobalEnv)
注意事项
- 读取含中文内容的CSV时,可以给
read.csv()增加fileEncoding参数指定文件编码,避免出现乱码。 - 用
list.files()匹配CSV文件时,建议把正则规则写为pattern = "\\.csv$",避免匹配到文件名中间带.csv后缀的非目标文件。
内容的提问来源于stack exchange,提问作者jvalenti
相关产品推荐
相关产品推荐

