У меня есть файл CSV, и я хочу массово импортировать этот файл в свою базу данных sqlite3 с помощью Python. команда ".import .....". но вроде так работать не может. Может ли кто-нибудь привести мне пример того, как это сделать в sqlite3? Я на всякий случай использую окна. Спасибо
106
Ответы:
источник
not all arguments converted during string formatting
когда пытаюсь использовать этот метод.Создание подключения sqlite к файлу на диске оставлено в качестве упражнения для читателя ... но теперь есть двухстрочный интерфейс, который стал возможным благодаря библиотеке pandas
источник
df
поэтому я сократил ваш пример до:pandas.read_csv(csvfile).to_sql(table_name, conn, if_exists='append', index=False)
Мои 2 цента (более общий):
источник
Команда
.import
является функцией инструмента командной строки sqlite3. Чтобы сделать это в Python, вы должны просто загрузить данные, используя любые возможности Python, такие как модуль csv , и вставить данные как обычно.Таким образом, вы также можете контролировать, какие типы вставляются, вместо того, чтобы полагаться на, казалось бы, недокументированное поведение sqlite3.
источник
источник
Большое спасибо за ответ Берни ! Пришлось немного подправить - вот что у меня сработало:
Мой текстовый файл (PC.txt) выглядит так:
источник
Вы правы, это правильный
.import
путь, но это команда из оболочки SQLite3.exe. Многие из основных ответов на этот вопрос связаны с собственными циклами python, но если ваши файлы большие (у меня от 10 ^ 6 до 10 ^ 7 записей), вы хотите избежать чтения всего в pandas или использования собственного понимания / цикла списка Python (хотя я не время их для сравнения).Я считаю, что для больших файлов лучше всего заранее создать пустую таблицу
sqlite3.execute("CREATE TABLE...")
, удалить заголовки из файлов CSV, а затем использоватьsubprocess.run()
для выполнения оператора импорта sqlite. Поскольку последняя часть, я считаю, наиболее актуальна, я начну с нее.subprocess.run()
Пояснение
В командной строке вы ищете команду
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.Удаление заголовков
Не совсем суть вопроса, но вот что я использовал. Опять же, я не хотел в любой момент читать файлы целиком в память:
источник
На основе решения Guy L (Love it), но может обрабатывать экранированные поля.
источник
Вы можете сделать это с помощью
blaze
&odo
эффективноOdo сохранит файл csv в
data.db
(база данных sqlite) по схемеdata
Или вы используете
odo
напрямую, безblaze
. В любом случае все в порядке. Прочтите эту документациюисточник
Если файл CSV должен быть импортирован как часть программы на Python, то для простоты и эффективности вы можете использовать следующие
os.system
строки:Дело в том, что при указании имени файла базы данных данные будут автоматически сохранены, если при их чтении нет ошибок.
источник
источник
в интересах простоты вы можете использовать инструмент командной строки sqlite3 из Makefile вашего проекта.
make test.sql3
затем создает базу данных sqlite из существующего файла test.csv с единственной таблицей «test». затем вы можетеmake test.dump
проверить содержимое.источник
Я обнаружил, что может возникнуть необходимость разбить передачу данных из CSV в базу данных по частям, чтобы не закончилась нехватка памяти. Сделать это можно так:
источник