如何加快这个python脚本来读取和处理csv文件?

时间:2017-07-25 19:08:49

标签: python python-2.7 csv

我正在尝试在python中处理一个相对较大(约100k行)的csv文件。这就是我的代码:

#!/usr/bin/env python

import sys
reload(sys)
sys.setdefaultencoding("utf8")
import csv
import os

csvFileName = sys.argv[1]


with open(csvFileName, 'r') as inputFile:
    parsedFile = csv.DictReader(inputFile, delimiter=',')
     totalCount = 0
     for row in parsedFile:
         target = row['new']
         source = row['old']
         systemLine = "some_curl_command {source}, {target}".format(source = source, target = target)
         os.system(systemLine)
         totalCount += 1
         print "\nProcessed number: " + str(totalCount)

我不确定如何优化此脚本。我应该使用除DictReader之外的东西吗?

我必须使用Python 2.7,并且无法升级到Python 3。

2 个答案:

答案 0 :(得分:0)

  1. 如果要避免多处理,可以将长csv文件拆分为几个较小的csv并同时运行它们。喜欢

    $ python your_script.py 1.csv &
    $ python your_script.py 2.csv & 
    
  2. Ampersand代表linux envs中的后台执行。 More details here.我对Windows中的任何类似内容都没有足够的了解,但是可以打开几个cmd窗口,哈哈。

    无论如何,坚持使用multiprocessing,ofc。

    会更好
    1. 如何使用requests代替curl?

      import requests
      response = requests.get(source_url)
      html = response.content
      with open(target, "w") as file:
          file.write(html)
      
    2. Here's the doc.

      1. 避免使用打印报表,在长期运行中,它们会慢慢地发生。对于开发和调试没问题,但是当您决定开始最终执行脚本时,可以将其删除并直接在目标文件夹中检查已处理文件的数量。

答案 1 :(得分:0)

运行

subprocess.Popen(systemLine)

而不是

os.system(systemLine)

应该加快速度。请注意,systemLine必须是一个字符串列表,例如['some_curl_command','source','target']才能工作。如果要限制并发命令的数量,请查看that