Python 如何使用pandas将大型csv文件转储到表中?
我有一个Python 如何使用pandas将大型csv文件转储到表中?,python,pandas,postgresql,csv,Python,Pandas,Postgresql,Csv,我有一个csv文件,大小超过1GB。通常,这就是我使用pandas将csv转换为表的方式 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.t
csv
文件,大小超过1GB
。通常,这就是我使用pandas
将csv
转换为表的方式
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
文件,对每个列执行操作
,并将其转储到表
现在,由于我的文件非常大,pandas
无法将其加载到数据框中。因此,我在网上查找了一个解决方案,其中讨论了如何将数据
分块加载并执行操作。这就是我想到的
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
它给出了每个块的列。那么块大小是否意味着它一次读取n
行?我不太明白如何确保覆盖所有的块并将数据添加到表中
,以便最终,我将所有数据
转储到表中
就像我处理较小的csv
文件一样?迭代器和chunksize
上的更新文档可以在这里找到:
那么块大小是否意味着它一次读取n
行
对
使用chunksize
的代码基本正确,只需将每个块添加到数据帧中
如果所有列都是相同的类型,并且不需要任何特殊的逻辑/类型,则转换整个数据帧,而不是逐列进行转换。或者,您可以将dtypes
指定为read\u csv
。但是,您将失去指定“强制”
的权限,因此将保持原样
对于非常大的数据,最好将整个读取、转换成块。还请注意,使用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)
向数据帧添加块不会增加内存消耗吗?或者,对于每个块,我需要一直转储到数据库?对于1GB,您可能会将其保存在内存中,然后转储到DB。但你提出了一个很好的观点,尤其是对于较大尺寸的。最好是分块进行:读取、转换为sql。但是low_memory=False
没有意义。我已经修改了我的答案。只是另一个问题。如果我有一个非常小的csv文件,我还能保持块大小不变吗?我计划用这段代码将任意大小的csv转换成表格。是的,当然。这也行得通,因为如果它非常小,它将在单个循环中处理。因此,除了循环构造的微秒开销外,它对小文件和大文件同样有效。顺便说一句,我建议您尝试在read_csv
中指定dtypes
,并检查是否确实需要“强制”选项。df.columns中col的:df[col]=pd.to_numeric…
是代码中效率最低的部分,因此仅在必要时使用它。如果您的数据类型都相同,也可以使用afterdf=pd.DataFrame(行)
。