如何以connection作为文件向文本文件添加行?现有R代码无法运行求解决方案
问题分析与解决方案
咱们来拆解下你的代码为啥跑不通,以及怎么修复它~
你的这段R代码主要有几个核心问题:
- 每次循环都重复打开原文件的连接,却从不关闭,不仅浪费系统资源,还会导致每次读取都是从文件开头开始,最终写入的内容会大量重复;
readLines(con, i)的用法有误:这里的i是本次读取的行数,不是累计行数,所以第一次读1行,第二次读2行(包含第一次的那行),最终目标文件会是重复内容的堆叠;- 循环里的
next完全多余,起不到任何实际作用。
正确实现方式(适合大文件)
如果你的原文件体积很大,不想一次性加载到内存里,推荐用这种方式:只打开一次文件连接,逐行读取并写入,最后确保连接关闭:
# 打开原文件的只读连接 source_con <- file("en_US.twitter.txt", "r") # 打开目标文件的写入连接("w"表示覆盖原有内容,要追加的话用"a") target_con <- file("D:/myfile.txt", "w") # 用tryCatch确保即使出错也会关闭连接 tryCatch({ for (i in 1:10) { # 每次读取1行 current_line <- readLines(source_con, n = 1) # 如果文件不足10行,读到空内容就终止循环 if (length(current_line) == 0) break # 将该行写入目标文件 writeLines(current_line, con = target_con) } }, finally = { # 无论成功还是失败,都关闭两个连接 close(source_con) close(target_con) })
更简洁的实现(适合小文件)
如果原文件不大,可以一次性读取所有行,再直接写入前10行:
# 读取原文件所有行 all_lines <- readLines("en_US.twitter.txt") # 写入前10行到目标文件(如果文件不足10行,会自动写入所有内容) writeLines(all_lines[1:10], "D:/myfile.txt")
关键注意事项
- 永远不要在循环里重复打开文件连接,这会严重拖慢代码效率,还可能导致资源泄漏;
readLines的n参数控制单次读取的行数,不是从开头累计的行数;- 操作文件连接后一定要关闭,用
tryCatch + finally是最安全的方式,避免程序出错时连接没关闭。
内容的提问来源于stack exchange,提问作者user2165379
相关产品推荐
相关产品推荐

