#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
коде значение вводится в виде текста.