удаление кодировки "UTF8": 0x00 символов из кадра данных панд для курсора psycopg2 - PullRequest
1 голос
/ 21 мая 2019

Я пытаюсь вставить строки в базу данных Postgresq, используя следующий код, который я взял где-то в SO:

def to_sql(engine, df, table, if_exists='fail', sep='\t', encoding='utf8',
    schema='public', dtypes_sql=None, verbose=False):
    # Create Table
    ## istruzioni diverse se le colonne hanno dtypes diversi
    if verbose==True:
        print("Scrivo tabella targhe su tabella di schema {}".format(schema))
    if dtypes_sql is None:
        df[:0].to_sql(table, engine, if_exists=if_exists,schema=schema, index=False)
    else:
        df[:0].to_sql(table, engine, if_exists=if_exists,schema=schema, index=False,dtype=dtypes_sql)
    # Prepare data
    output = StringIO()
    df.to_csv(output, sep=sep, header=False, encoding=encoding, index=False)
    output.seek(0)

    # Insert data
    connection = engine.raw_connection()
    cursor = connection.cursor()
    #handling different schemas:
    if schema in ['public','dbo']:
        cursor.copy_from(output, table, sep=sep, null='')

    else:
        new_table = schema + "." + table
        cursor.copy_from(output, new_table, sep=sep, null='')
    connection.commit()
    cursor.close()
    if verbose==True:
        print("Saved")
    return None

Данные были прочитаны из кадра данных, который первоначально считывался из файла кодировки latin1.Я попытался сделать следующее, чтобы очистить мой оригинальный DataFrame, но безуспешно:

input_file_df.replace(to_replace=b'\x00',value=' ', inplace=True,regex=True)
input_file_df.replace(to_replace="\x00", value=" ",inplace=True)
input_file_df.where(pd.notnull(input_file_df), None,inplace=True)

Я хотел бы знать:

  1. как удалить строки, содержащие 0x00, из DataFrame:
  2. если есть какой-либо способ пропустить плохие строки в bulkinser;

Ответы [ 2 ]

0 голосов
/ 21 мая 2019

Удаление нулевого кадра данных в pandas можно выполнить следующим образом:

import re
re_null = re.compile(pattern='\x00')
input_file_df.replace(regex=re_null,value=' ', inplace=True)

это позволит избежать проблемы 0x00

0 голосов
/ 21 мая 2019

Вы должны использовать strip('\x00'):

b = b'caf\xc3\xa9\x00\x00';
print(b.decode('utf8').strip('\x00'))

или replace('\x00', ' '):

b = b'caf\xc3\xa9\x00\x00';
print(b.decode('utf8').replace('\x00', ' '))

Выходы

café
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...