#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
столбец.