在 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

Python循环遍历CSV文件及其列

遍历 CSV 的每一行并使用 Python-Pandas 写入文件夹中的单个 JSON 文件

python读取csv文件,并把值遍历到字典里

python读取csv文件,并把值遍历到字典里