【问题标题】:Appending chunks of CSV to Database with Pandas使用 Pandas 将 CSV 块附加到数据库
【发布时间】:2022-01-20 22:19:30
【问题描述】:

我正在尝试改进一些代码,并在它完成后停止它抛出警告/错误(由于使用next(iter)

我实际上是在创建一个数据库引擎,以块的形式读取一个大型 CSV 文件,并将此处的数据附加到一个 PostgreSQL 数据库。

但是,一旦 while 循环完成,就会出现错误。我可能会添加一些错误处理来抑制这种情况,但想知道是否有更有效的方法来做到这一点。

   # Create database engine
   engine = create_engine(# contains Postgres connection stuff)

   # Read in CSV
   iter = pd.read_csv("myfile.csv", iterator=True, chunksize=100000)

   df = next(iter)

   # Convert column to datetime
   df.date_col = pd.to_datetime(df.date_col)

   # Create table
   df.head(0).to_sql(name = "mytable", con = engine, if_exists='replace')

   # Add first chunk
   df.to_sql(name="mytable", con=engine, if_exists='append')

   # Add remaining CSV data to database table
   while True:
       df = next(iter)
       df.date_col = pd.to_datetime(df.date_col)
       df.to_sql(name="mytable", con=engine, if_exists='append')

【问题讨论】:

  • 有错误?什么错误?你能包括回溯吗?是StopIteration 错误吗?
  • 谢谢。不知道为什么我没有想到 for 循环。

标签: python pandas postgresql csv


【解决方案1】:

这里的问题是while(True) 循环的使用。理想情况下,要迭代一个迭代器,您可以使用 for 循环。

如果您想使用while 循环,请查看how to use iterator in while loop

我会使用这样的东西来实现你正在寻找的东西:

_iter = pd.read_csv("myfile.csv", iterator=True, chunksize=100000)

df = next(_iter)

# Convert column to datetime
df.date_col = pd.to_datetime(df.date_col)

# Create table
df.head(0).to_sql(name = "mytable", con = engine, if_exists='replace')

# Add first chunk
df.to_sql(name="mytable", con=engine, if_exists='append')

for i in _iter:
    i.date_col = pd.to_datetime(i.date_col)
    i.to_sql(name="mytable", con=engine, if_exists='append')

使用for 循环可避免遇到StopIteration 异常,该异常表示迭代器结束。 Read More on Iterators here.

【讨论】:

    猜你喜欢
    • 2018-04-14
    • 2015-03-06
    • 1970-01-01
    • 2018-09-25
    • 1970-01-01
    • 1970-01-01
    • 2020-09-13
    • 1970-01-01
    • 2018-05-24
    相关资源
    最近更新 更多