2015-01-01 23 views
0

我正在做一個非常簡單的操作;打開一個csv文件,刪除第一列,然後寫出一個新文件。下面的代碼工作正常,但它需要50-60秒,在我的700 MB的文件:在csv模塊中提高csv.reader/csv.writer的速度

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中獲得可比較的性能?

回答

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()

+0

我把你的代碼用相關的'with open'語句取樣,並用'_ = result.write'代替'source.write'。結果代碼仍然比@ histrio的解決方案長30-40%。 – zkurtz

+0

我的代碼和histrio之間唯一重要的區別是處理行中沒有','的情況。如果你確定不可能發生,或者如果確實發生異常,那麼使用稍簡單的代碼即可。 –

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的文件):

  • 慶典 - 193毫秒
  • 蟒蛇CSV解析 - 2391毫秒
  • Python字符串分割 - 620毫秒

的Python 2是出於某種原因快:

  • 慶典 - 193毫秒
  • 蟒蛇CSV解析 - 1471毫秒
  • python string splitting - 373 ms
+0

我得到了類似的結果,但是在'result.write(tail)'之前加了'_ ='來防止它打印每行上的字符數。所以對於我的原始文件,它仍然需要比bash多一倍的時間。 – zkurtz

+0

您可以爲此任務編寫C擴展名:) – histrio