首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在csv模块中提高csv.reader/csv.writer的速度

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

Stack Overflow用户
提问于 2015-01-01 19:40:57
回答 2查看 1.4K关注 0票数 0

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

代码语言:javascript
代码运行次数:0
运行
复制
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秒内完成了相同的操作:

代码语言:javascript
代码运行次数:0
运行
复制
START_TIME=$SECONDS
cut -d',' -f2- < test.csv > testnew.csv
echo $(($SECONDS - $START_TIME))

有什么方法可以在Python中获得类似的性能吗?

EN

回答 2

Stack Overflow用户

发布于 2015-01-01 20:27:46

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

代码语言:javascript
代码运行次数:0
运行
复制
for line in source:
   parts = line.split(',', maxsplit=1)
   source.write(parts[len(parts)-1])

这将传递没有逗号的行。它在逗号之后保留空格(我不知道cut做什么。如果不想这样做,可以使用re.split而不是line.split,或者在最后一行的关闭)之前添加.lstrip()

票数 1
EN

Stack Overflow用户

发布于 2015-01-01 20:30:53

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

代码语言:javascript
代码运行次数:0
运行
复制
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文件):

  • 巴什- 193毫秒
  • python解析- 2391 ms
  • python字符串拆分- 620 ms

由于某些原因,Python 2速度更快:

  • 巴什- 193毫秒
  • python解析- 1471 ms
  • python字符串拆分- 373 ms
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27734024

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档