Вы правы, это правильный .importпуть, но это команда из оболочки SQLite3.exe. Многие из основных ответов на этот вопрос связаны с собственными циклами python, но если ваши файлы большие (у меня от 10 ^ 6 до 10 ^ 7 записей), вы хотите избежать чтения всего в pandas или использования собственного понимания / цикла списка Python (хотя я не время их для сравнения).
Я считаю, что для больших файлов лучше всего заранее создать пустую таблицу sqlite3.execute("CREATE TABLE..."), удалить заголовки из файлов CSV, а затем использовать subprocess.run()для выполнения оператора импорта sqlite. Поскольку последняя часть, я считаю, наиболее актуальна, я начну с нее.
subprocess.run()
from pathlib import Path
db_name = Path('my.db').resolve()
csv_file = Path('file.csv').resolve()
result = subprocess.run(['sqlite3',
str(db_name),
'-cmd',
'.mode csv',
'.import '+str(csv_file).replace('\\','\\\\')
+' <table_name>'],
capture_output=True)
Пояснение
В командной строке вы ищете команду sqlite3 my.db -cmd ".mode csv" ".import file.csv table". subprocess.run()запускает процесс командной строки. Аргумент для subprocess.run()- это последовательность строк, которые интерпретируются как команда, за которой следуют все ее аргументы.
sqlite3 my.db открывает базу данных
-cmdФлаг после базы данных позволяет передавать в программу sqlite несколько команд выполнения. В оболочке каждая команда должна быть в кавычках, но здесь они просто должны быть их собственным элементом последовательности.
'.mode csv' делает то, что вы ожидаете
'.import '+str(csv_file).replace('\\','\\\\')+' <table_name>'это команда импорта.
К сожалению, поскольку подпроцесс передает все последующие -cmdстроки в кавычки, вам нужно удвоить обратную косую черту, если у вас есть путь к каталогу Windows.
Удаление заголовков
Не совсем суть вопроса, но вот что я использовал. Опять же, я не хотел в любой момент читать файлы целиком в память:
with open(csv, "r") as source:
source.readline()
with open(str(csv)+"_nohead", "w") as target:
shutil.copyfileobj(source, target)