проблема с форматом pandas.tocsv () (?), приводящая к ошибке при использовании psycopg2 copy_from

#python #pandas #postgresql #csv #psycopg2

Вопрос:

Обзор: У меня есть функция во внешнем файле, которая возвращает фрейм данных, который я затем сохраняю в csv с:

 df.to_csv('filepath.csv', na_rep="0", index=False)
 

Затем я пытаюсь импортировать csv в таблицу postgres, используя функцию pyscopg2 copy_from:

 try:
    connect = psycopg2.connect(database = "", user = "", password = "", host = "", port = "")  
except:
    print("Could not connect to database")
cursor = connect.cursor()
with open("filepath", 'r') as open_csv:
    next(open_csv)
    try:
        cursor.copy_from(open_csv, sep=",")
        connect.commit()
        print("Copy Complete")
    except:
        print("Copy Error")
    cursor.close()
 

Это приводит к исключению ошибки копирования в приведенном выше коде (так что никаких подробностей), но есть некоторые странные предостережения:

По какой-то причине, если я открою csv в libre office и вручную сохраню его в текстовом формате csv, а затем выполню описанный выше процесс psycopg2 copy_from, копирование будет работать, и проблем не возникнет. Таким образом, по какой бы то ни было причине, в глазах psycopg2 copy_from что-то не так с записью в.csv (), которая исправляется, если я просто вручную сохраню файл. Сохранение csv вручную не приводит к каким-либо визуальным изменениям, поэтому что здесь происходит?

Кроме того, приведенный выше фрагмент кода psycopg2 работает без ошибок в другом файле, в котором все манипуляции с фреймами данных содержатся в одном файле, в котором выполняется to.csv (). Итак, что-то в возврате фрейма данных из функции во внешнем файле отключено?

Fwiw, при отладке проблема возникла в строке .copy_from (), поэтому проблема как-то связана с форматированием csv, и я не могу ее понять. Я нашел обходной путь с помощью sqlalchemy, но хотел бы знать, чего мне здесь не хватает, вместо того, чтобы игнорировать проблему.

В журнале ошибок postgres ошибка: «недопустимый синтаксис ввода для типа integer: «-1.0». Эта ошибка возникает в последнем столбце моей таблицы, где значение задано как INT, а в csv значение равно -1, но оно интерпретируется как -1,0. Меня смущает то, что если я использую запрос на КОПИРОВАНИЕ для прямого ввода файла csv в postgres, у него нет проблем. Почему он интерпретирует значение как -1.0 через psycopg2, но не непосредственно в postgres?

Это мой первый пост, поэтому, если потребуется более подробная информация, дайте мне знать — заранее спасибо за помощь

Комментарии:

1. А сообщение об ошибке-это что? Добавьте в качестве обновления свой вопрос.

2. Ошибка — это просто исключение в фрагменте кода «Ошибка копирования» — я ее уточнил, но, к сожалению, она не содержит никакой дополнительной информации

3. Если бы вы не проглотили сообщение об исключении, это было бы полезно. Или загляните в журнал Postgresql и посмотрите, что это такое? В любом случае без сообщения об ошибке это никуда не приведет.

4. Добавлено сообщение об ошибке postgres — это синтаксис ввода nvalid для типа integer: «-1.0», но эта ошибка связана только с кодом psycopg2. Если я возьму тот же csv-файл, который не работает с кодом psycopg2, и введу его в базу данных с помощью запроса на КОПИРОВАНИЕ, проблем не возникнет

5. Это проблема кастинга: select -1.0::integer; -1, select '-1.0'::integer; ERROR: invalid input syntax for type integer: "-1.0" . В psycopg2 коде значение вводится в виде текста.