Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用pandas将大型csv文件转储到表中?_Python_Pandas_Postgresql_Csv - Fatal编程技术网

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…
是代码中效率最低的部分,因此仅在必要时使用它。如果您的数据类型都相同,也可以使用after
df=pd.DataFrame(行)