使用Python解析12GB CSV

Sta*_*anO 5 python csv r bigdata

我有一个12 GB的CSV文件.我希望只从这些数据中提取一些列,然后编写一个新的CSV,希望我可以加载到R中进行分析.

问题是我在尝试在写入新CSV文件之前立即加载整个列表时出现内存错误.如何逐行解析数据然后创建CSV输出?

这是我到目前为止:

import pandas

colnames = ['contributor name', 'recipient name', 'recipient party', 'contributor cfscore', 'candidate cfscore', 'amount']

DATA = pandas.read_csv('pathname\filename.csv', names=colnames)
DATA.to_csv(''pathname\filename.csv', cols = colnames)
Run Code Online (Sandbox Code Playgroud)

GSe*_*See 8

在R中,您可以使用fread流行的data.table包中的函数.

您可以使用该drop=参数指定不读取的列 - 没有为它们分配内存,并且根本不读取它们.或者select=您想要保留的列,如果更方便的话. fread非常非常快速地读取csv文件.

如果您正在处理这么多数据,那么您可能还是想要熟悉data.table包.


或者,?read.csv.sqlsqldf包中说它会

将文件读入R,用sql语句对其进行过滤.只有经过滤的部分由R处理,因此可以容纳大于R的文件.

这是一个例子:

write.csv(iris, "iris.csv", quote = FALSE, row.names = FALSE)
iris2 <- read.csv.sql("iris.csv", 
                      sql="select * from file where Species = 'setosa' ")
Run Code Online (Sandbox Code Playgroud)

  • @ user3342483感谢您的文件.我下载并检查了它.该行(35,265)在字段20中有一个`\n`.要查看我使用过的那行:`head -n 35267 contribDB_2012.csv | 尾巴-n 4` `fread`还没有处理嵌入的`\n`.我会看一看 ... (2认同)

moo*_*eep 5

您可以使用该csv模块逐行处理文件.像这样的东西可能会起作用:

import csv
infname = "csv.csv"
outfname = "csv_stripped.csv"
cols = ["col1", "col2", "col3"]
with open(infname) as inf, open(outfname, 'w+') as outf:
    reader = csv.DictReader(inf)
    writer = csv.DictWriter(outf, cols, extrasaction='ignore')
    writer.writeheader()
    for line in reader:
        writer.writerow(line)
Run Code Online (Sandbox Code Playgroud)

以供参考: