【问题标题】:Are there any valid reasons not to use fread() and fwrite() over read.csv() and write.csv()? [closed]有什么正当理由不使用 fread() 和 fwrite() 而不是 read.csv() 和 write.csv()? [关闭]
【发布时间】:2017-08-14 11:45:39
【问题描述】:

fread()fwrite() 是 R 中 data.table 包的一部分,它们的执行速度明显快于基本的 read.csv()write.csv() 函数。

当我处理大量 csv 文件(数 GB 大小)时,我现在发现自己总是使用 fread()fwrite() 而不是基本函数 read.csv()write.csv(),因为它们的执行速度要快得多。

我现在开始怀疑read.csv()write.csv() 的表现优于fread()fwrite() 是否有任何正当理由(而不是单纯的意见)。

有没有这样的原因?

【问题讨论】:

  • CSV 的专用读写方法会考虑转义和字段分隔符等内容,而使用普通读写方法则必须自己处理。
  • 不,没有。
  • fwrite 可以写带有列表列的数据表
  • 我能想到的唯一原因是避免包依赖(不是什么大事,而是一个决胜局)
  • 这有点重复,但是当 fread 失败时你应该使用 read.csv。它可能仍然无法正常工作,但如果 csv 很小,则值得一试。

标签: r csv data.table read.csv


【解决方案1】:

utils 包中的基本读取功能可以做到 fread 无法做到的一件事是从任何类型的文本连接中读取数据。

例如,假设有一个名为 sample.zip 的存档,并且该存档中有一个名为 sample.csv 的文件,其中包含以下几行:

A,B
1,x
2,y

read.csv 无需解压即可读取该文件:

zipcon <- unz("sample.zip", "sample.csv")
base_result <- read.csv(zipcon)
base_result
#   A B
# 1 1 x
# 2 2 y

fread 不能:

library(data.table)

zipcon <- unz("sample.zip", "sample.csv")
dt_result <- fread(zipcon)
# Error in fread(zipcon) : 
#   'input' must be a single character string containing a file name, a command,
#   full path to a file, a URL starting 'http[s]://', 'ftp[s]://' or 'file://',
#   or the input data itself

【讨论】:

    猜你喜欢
    • 2012-09-12
    • 2010-09-22
    • 2012-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-10
    • 2015-10-04
    相关资源
    最近更新 更多