Почему эти целые числа преобразуются в случайные символы?

#python #sqlite

#python #sqlite

Вопрос:

Когда я запускаю следующий скрипт python для данного csv-файла ( csv_file ), целые числа преобразуются в случайные символы в базе данных sqlite3. Я бы хотел, чтобы эти целые числа оставались целыми, когда они вводятся в базу данных.

 data = pd.read_csv(csv_file, header=0)
csv_fieldnames = data.columns.values

"INSERT INTO "   table   " (id, paper, name) VALUES ("   ",".join('?'*len(csv_fieldnames))   ")"
  

Пример:

Пример файла csv:

 id,paper,name
,7,AC-600
  

Код производит это:

 id          paper       name
----------  ----------  ----------
1                      AC-600
  

Когда это должно привести к этому:

 id          paper       name
----------  ----------  ----------
1           7          AC-600
  

Ответ №1:

Проблема здесь в том, что Pandas слишком умен (или глуп) для SQLite3. paper Столбец, который, как вы ожидаете, будет содержать значения int numpy.int64 , получает значения, а не значения int. SQLite3 обрабатывает их как простые байты, потому что это неизвестный тип. Таким образом, 7 преобразуется (в системе с небольшим конечным порядком) в b'x07x00x00x00x00x00x00x00' , то есть в пробел, за которым следуют нулевые символы, которые не содержат печатаемых символов. И именно по этой причине другие значения дают явно случайные символы.

Вы можете вручную принудительно ввести тип во время вставки или зарегистрировать адаптер в модуле sqlite3:

 def adapt_int64(i):
    return int(i)

sqlite3.register_adapter(np.int64, adapt_int64)
  

После этого вы можете безопасно вставлять numpy.int64 значения в свой integer столбец.