我正在尝试用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。
-
如果你想避免多处理,可以将你的长csv文件分成几个较小的csv并同时运行它们。喜欢
$ python your_script.py 1.csv & $ python your_script.py 2.csv &
& 符号代表 Linux 环境中的后台执行。更多细节在这里。我对Windows中类似的东西没有足够的了解,但是可以打开几个cmd窗口,哈哈。
无论如何,坚持使用多处理(ofc(要好得多。
-
用
requests
代替curl怎么样?import requests response = requests.get(source_url) html = response.content with open(target, "w") as file: file.write(html)
这是文档。
- 避免打印语句,从长远来看,它们会像地狱一样慢。对于开发和调试,这是可以的,但是当您决定开始脚本的最终执行时,您可以将其删除并直接在目标文件夹中检查已处理文件的计数。
正在运行
subprocess.Popen(systemLine)
而不是
os.system(systemLine)
应该加快速度。请注意,systemLine 必须是字符串列表,例如 ['some_curl_command', 'source', 'target'] 才能工作。如果要限制并发命令的数量,请查看一下。