提高csv模块中csv.reader / csv.writer的速度

时间:2015-01-01 19:40:57

标签: performance csv python-3.x

我做了一个非常简单的操作;打开csv文件,删除第一列,然后写出新文件。以下代码工作正常,但我的700 MB文件需要50-60秒:

import csv
from time import time
#create empty output file
f = open('testnew.csv',"w")
f.close()
t = time()
with open('test.csv',"rt") as source:
    rdr= csv.reader( source )
    with open('testnew.csv',"a") as result:
        wtr= csv.writer( result )
        for r in rdr:
            del r[0]
            _ = wtr.writerow( r )

print(round(time()-t))

相比之下,以下shell脚本在7-8秒内完成相同的操作:

START_TIME=$SECONDS
cut -d',' -f2- < test.csv > testnew.csv
echo $(($SECONDS - $START_TIME))

有没有办法可以在Python中获得类似的性能?

2 个答案:

答案 0 :(得分:1)

如果我理解正确的话,shell脚本只是在第一个,分割行,无论它是否用引号括起来,并写出第二部分。 (如果没有,,我不知道shell脚本会做什么。)csv方法更多,这对你没用。要在python中执行与shell相同的操作,请跳过csv模块。

for line in source:
   parts = line.split(',', maxsplit=1)
   source.write(parts[len(parts)-1])

这会传递没有逗号的行。它在逗号后面留空格(我不知道cut的作用。如果你不想这样做,你可以使用re.split代替line.split或者只添加.lstrip()在最后一行收盘)之前。

答案 1 :(得分:1)

你的bash脚本不解析csv文件,只能拆分和剪切。所以,在python中我们也可以这样做:

with open('test.csv',"r") as source:
    with open('testnew.csv',"w") as result:
        for l in source:
            _, tail = l.split(',', 1)
            result.write(tail)

我的简单分析(4Mb文件):

  • bash - 193 ms
  • python csv解析 - 2391 ms
  • python string splitting - 620 ms

Python 2由于某种原因更快:

  • bash - 193 ms
  • python csv解析 - 1471 ms
  • python string splitting - 373 ms