[英]How to dump a large csv file to a table using pandas?
我有一个大小超过1 GB
的csv
文件。 通常这就是我使用pandas
将csv
转换为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
文件一样?
可以在此处找到有关iterator
和chunksize
大小的更新文档: 逐块迭代文件。
那么块大小是否意味着它一次读取
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.