2017-07-25 167 views
0

我正在嘗試在python中處理一個相對較大(大約10萬行)的csv文件。這是我的代碼的樣子:如何加速這個python腳本來讀取和處理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,如果你想避免多處理器有可能你長的CSV文件拆分成幾個較小的CSV並在同時運行它們不能升級到Python 3

+1

問題並不在於你如何閱讀CSV文件,而是你要爲文件的每一行拋出'curl'。相反:1.使用本地Python代碼來檢索URL,2.使用多線程一次創建多個請求。 – kindall

+0

還有什麼我可以做的嗎?我是python的新手,我不想開始搞亂多線程。 – alexgbelov

+1

編號99%的腳本運行時間是Web請求上的腳本,因爲在開始下一個之前,您正在等待每個腳本完成。爲了避免這種情況,您必須一次運行多個程序。 – kindall

回答

0
  1. 。像

    $ python your_script.py 1.csv & 
    $ python your_script.py 2.csv & 
    

與符號代表在linux ENVS後臺執行。 More details here.我對Windows中沒有足夠的類似知識,但可以打開幾個cmd窗口,哈哈。

無論如何,堅持multiprocessing,ofc。

  1. 如何使用requests而不是捲曲?

    import requests 
    response = requests.get(source_url) 
    html = response.content 
    with open(target, "w") as file: 
        file.write(html) 
    

Here's the doc.

  • 避免打印報表,長期來看他們是緩慢的地獄。對於開發和調試是可以的,但是當您決定開始腳本的最終執行時,您可以將其刪除並直接在目標文件夾中檢查已處理文件的計數。
  • 0

    運行

    subprocess.Popen(systemLine) 
    

    代替

    os.system(systemLine) 
    

    應該加快速度。請注意systemLine必須是一個字符串列表,例如['some_curl_command','source','target']才能工作。如果你想限制併發命令的數量看看that