繁体   English   中英

如何使用 pandas 将大型 csv 文件转储到表中?

[英]How to dump a large csv file to a table using pandas?

我有一个大小超过1 GBcsv文件。 通常这就是我使用pandascsv转换为table的方式。

import pandas as pd
from sqlalchemy import create_engine

file_path = "/path/to/test.csv"
df = pd.read_csv(file_path)

for col in df.columns:
    # convert each column values to numeric 
    df[col] = pd.to_numeric(df[col], errors='coerce')

engine = create_engine('postgresql://username:password@localhost:port/dbname')
df.to_sql("mytable", engine)

如您所见,我加载了csv文件,对每一column执行操作并将其转储到table

现在由于我的文件非常大, pandas无法将其加载到data frame 所以我在网上查找了一个解决方案,它谈到了以块加载data并执行操作使用 pandas 有效地读取大型 CSV 文件而不会崩溃 所以这就是我想出的

file_path = "/path/to/test.csv" 
chunksize = 100000
for chunk in pd.read_csv(file_path, chunksize=chunksize, iterator=True, low_memory=False):
    columns = chunk.columns

它给了我每个块的columns 那么块大小是否意味着它一次读取n行? 我不太清楚如何确保覆盖所有块并继续将data附加到table中,以便最终将所有data转储到table ,就像使用较小的csv文件一样?

可以在此处找到有关iteratorchunksize大小的更新文档: 逐块迭代文件

那么块大小是否意味着它一次读取n行?

是的。

您使用chunksize的代码大部分是正确的,您只需将每个块添加到 dataframe 中。

如果您的所有列都是相同类型并且不需要任何特殊逻辑/类型,则转换整个 DataFrame 而不是逐列进行。 或者,您可以将dtypes指定为read_csv 但是,您将无法指定'coerce' ,因此将保持原样。

对于非常大的数据,最好分块进行整个读取,转换,to_sql。 另请注意,在这种情况下使用low_memory=False是没有意义的,请使用默认的True 无论如何,您稍后都会转换类型,因此混合类型推断(这可能会发生)无关紧要。

engine = create_engine('postgresql://username:password@localhost:port/dbname')
reader = pd.read_csv(file_path, chunksize=chunksize, low_memory=True)
for rows in reader:
    df = pd.DataFrame(rows)
    # column conversions
    for col in df.columns:
        df[col] = pd.to_numeric(df[col], errors='coerce')
    # sql export
    df.to_sql("mytable", engine)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM