Как вывести большой CSV-файл в таблицу, используя pandas? - PullRequest
1 голос
/ 23 апреля 2020

У меня есть файл csv, размер которого превышает 1 GB. Обычно так я конвертирую csv в table, используя pandas.

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 файлами?

1 Ответ

1 голос
/ 23 апреля 2020

Обновленные документы по iterator и chunksize можно найти здесь: Итерация по фрагментам файлов по фрагментам .

То же самое относится и к размеру фрагментов: n строк за раз?

Да.

Ваш код, использующий chunksize, в основном правильный, вам просто нужно добавить каждый блок в ваш фрейм данных.

Если все ваши столбцы имеют одинаковый тип и не требуют какой-либо специальной логики / типов, преобразуйте весь DataFrame вместо того, чтобы делать это столбец за столбцом. Или вы можете указать от dtypes до read_csv. Однако вы потеряете доступ к указанию 'coerce', поэтому оставите его как есть.

Для очень больших данных лучше выполнить все операции чтения, преобразования, в_ 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...