在 Python 中逐步遍历 CSV 文件
Posted
技术标签:
【中文标题】在 Python 中逐步遍历 CSV 文件【英文标题】:Step through CSV file incrementally in Python 【发布时间】:2019-09-24 05:15:58 【问题描述】:我正在尝试加快将大型 CSV 文件加载到 mysql 数据库中的速度。使用此代码加载 4GB 文件大约需要 4 小时:
with open(source) as csv_file:
csv_reader = csv.reader(csv_file, delimiter=',')
next(csv_reader)
insert_sql = """ INSERT INTO billing_info_test (InvoiceId, PayerAccountId, LinkedAccountId) VALUES (%s, %s, %s) """
for row in csv_reader:
cursor.execute(insert_sql,row)
print(cursor.rowcount, 'inserted with LinkedAccountId', row[2], 'at', datetime.now().isoformat())
print("Committing the DB")
mydb.commit(
cursor.close()
mydb.close()
我想使用executemany() 语句来加快速度。为此,您必须将元组列表传递给第二个参数。
如果我在每次行迭代时构建列表,它会变得太大,并且当列表变得太大时会出现内存不足错误,并且脚本会崩溃。
我无法获取 csv_reader 或 csv_file 的长度以在范围语句中使用。
如何一次遍历 CSV 文件 1000 行并将结果存储在列表中,在 executemany 中使用它,然后存储接下来的 1000 行等,直到 CSV 文件结束?
【问题讨论】:
【参考方案1】:如果你需要在mysql中进行高速插入,可以尝试使用:
LOAD DATA LOCAL INFILE '/path/to/my_file.csv' INTO TABLE my_table;
【讨论】:
那里也没有运气。我尝试将 local-infile=1 放在 my.ini 中。然后我重新启动了服务。现在我收到此错误:ERROR 1148 (42000): The used command is not allowed with this MySQL version
我尝试将其放在 [mysql] 和 [mysqld] 部分下并每次都重新启动服务。
我觉得这篇文章应该对你有点帮助:***.com/questions/18437689/…
谢谢!那确实有帮助。我现在正在加载文件。但是,我仍然需要学习如何以编程方式处理这个问题。希望我能弄清楚!
那是超级快!我在大约 10 分钟内完成了。但是,当我进行选择时,所有行都是 NULL。所以这并不完全奏效。 ://
是的。它应该是这么快。尝试检查您的所有列(mysql)是否与您的 .csv 文件的列匹配。【参考方案2】:
一个小提示:
In [1]: import itertools
In [2]: rows = iter(range(10))
In [3]: while True:
...: batch = [*itertools.islice(rows, 3)]
...: if not batch:
...: break
...: print(batch)
...:
[0, 1, 2]
[3, 4, 5]
[6, 7, 8]
[9]
但我应该同意@heliosk
的观点,更好的解决方案是将LOAD DATA INFILE
用于大文件。在导入完成之前,您可能还需要disable keys。
【讨论】:
以上是关于在 Python 中逐步遍历 CSV 文件的主要内容,如果未能解决你的问题,请参考以下文章
Python 循环遍历 csv 文件中的 url 返回 \ufeffhttps://
遍历 for 循环并将检索到的数据保存在每个循环的唯一 csv 文件中 | Python