Файловый объект пуст после выполнения копирования в БД с помощью Psycopg2 - PullRequest
0 голосов
/ 01 апреля 2020

В приведенном ниже примере содержимое файла кажется пустым после выполнения команды copy_expert, и pd.read_csv выдает ошибку, утверждая, что это пустой файл. Файл кажется пустым, даже когда я выполняю эту операцию в обратном порядке (read_csv перед copy_expert). Почему файл пуст и как я могу справиться с этим сценарием?

    file = //download file from S3

    copy_sql = """
                   COPY %s FROM stdin WITH CSV HEADER
                   DELIMITER as ','
                   """
    cursor = self.connection.cursor()
    cursor.copy_expert(sql=copy_sql % table_name, file=file)
    cursor.close()

   df = pd.read_csv(file, dtype={// dtype value})

EDIT

Мне удалось решить эту проблему, выполнив следующие действия, однако было бы полезно понять, почему файловый объект очищается, а также есть ли более эффективный способ сделать это.

    file = //download file from S3
    file_clone = copy.deepcopy(file)
    copy_sql = """
                   COPY %s FROM stdin WITH CSV HEADER
                   DELIMITER as ','
                   """
    cursor = self.connection.cursor()
    cursor.copy_expert(sql=copy_sql % table_name, file=file)
    cursor.close()

   df = pd.read_csv(file_clone, dtype={// dtype value})

1 Ответ

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

Проблема в том, что после первого чтения данных файла, file pointer будет в конце файла; последующий вызов чтения не вернет данные.
Чтобы снова прочитать данные, необходимо переместить указатель на начало файла:

cursor.copy_expert(sql=copy_sql % table_name, file=file)
file.seek(0)
df = pd.read_csv(file, dtype={// dtype value})
...