#python #pandas #selenium #psycopg2 #tableau-desktop
Вопрос:
мой уровень мастерства во всем этом в лучшем случае новичок, но я беру всевозможные учебные пособия по кодированию, чтобы попытаться научиться, но потребность движется быстрее, чем мой уровень мастерства, поэтому я собираю воедино то, что я нахожу, и учусь на лету.
- Подробная информация о цели
Я пытаюсь создать сценарий, который экспортирует определенные файлы, а затем импортирует их в базу данных Postgres, чтобы я подключался и использовал информацию в таблице.
Ожидаемые результаты: Каждый час скрипт будет запускаться и загружать csv-файлы из определенных областей и импортировать эти данные в базу данных Postgres в соответствующем формате.
Фактические результаты: Каждый час скрипт запускается и загружает файлы .csv без проблем; однако я замечаю, что в pgAdmin есть столбцы, которые идентифицируются как «Реальные», и когда они отображаются с .00 в таблице, когда я подключаюсь к базе данных Postgres. т. е.: Почтовый индекс 12344.00 и т.д.
Я не получаю никаких сообщений об ошибках, потому что я считаю, что именно эта часть моего сценария вызывает проблему
for i in os.listdir('csvs'): if not os.path.splitext(i)[1].endswith(".csv"): continue table_name = os.path.splitext(i)[0].replace(' ','') print(table_name " table has been created.") cols = None with open(os.path.join('csvs', i), encoding="utf-8-sig") as csvFile: reader = csv.reader(csvFile) columns = next(reader) csv_cols = [] for j in columns: if '"' in j: j = j.replace('"','') j = f"{j}" csv_cols.append(j) cursor.execute(f"DROP TABLE {table_name}") # If the table exists it will drop and readd the table with the new data cursor.execute(f"CREATE TABLE {table_name}();") # with open(os.path.join('csvs', i), encoding="utf-8-sig") as csvFile: # reader = csv.reader(csvFile) # cols = next(reader) csvFile = os.path.join('csvs', i) df = pd.read_csv(csvFile) column_list = list(df.columns) q = f"ALTER TABLE {table_name} ADD COLUMN " query = q "%s;" for j in range(len(column_list)): column_name = column_list[j] cn = column_name if '"' in cn: cn = cn.replace('"','') cn = f""{cn}"" print(df[column_list].dtypes[j].name) if df[column_list].dtypes[j].name.startswith('object'): datatype = 'varchar' elif df[column_list].dtypes[j].name.startswith('float'): datatype = 'real' elif df[column_list].dtypes[j].name.startswith('int'): datatype = 'int' elif df[column_list].dtypes[j].name.startswith('bool'): datatype = 'boolean' elif df[column_list].dtypes[j].name.startswith('datetime'): datatype = 'date' else: print(df[column_list].dtypes[j]) column = f"{cn} {datatype}" query = q column cursor.execute(query) # cursor.execute(query, (psycopg2.extensions.AsIs(column),))
Причина, по которой я использовал приведенный выше код из учебника по панд, заключалась в том, что описание звучало так, как будто это было бы правильным решением. Первоначальная проблема, с которой я столкнулся, заключалась в том, что все отображалось как строка, мне нужен был способ попытаться преобразовать их в правильный тип данных, поэтому я попытался заставить панд прочитать csv и попытаться определить правильный тип данных.
Я сильно опирался на документацию pandas, чтобы попытаться достичь своей цели.
В графическом интерфейсе pgAdmin4 он показывает такие вещи, как почтовый индекс, как «реальный», и добавляет .00, он делает это с множеством других столбцов, таких как идентификатор пользователя и т. Д.
Комментарии:
1. вам может потребоваться другой метод для определения типа данных в CSV/pandas. Возможно, вам придется запустить собственный код для преобразования строк в число и сначала проверить, можно ли их преобразовать в целое число.
2. это может быть проще в использовании
for column_name in df.columns:
и последующем использованииdtype
(безs
) —df[column_name].dtype.name.