Mam plik CSV i chcę zaimportować ten plik do mojej bazy danych sqlite3 za pomocą Pythona. polecenie to „.import .....”. ale wydaje się, że nie może tak działać. Czy ktoś może mi dać przykład, jak to zrobić w sqlite3? Na wszelki wypadek używam okien. Dzięki
106
Odpowiedzi:
źródło
not all arguments converted during string formatting
kiedy próbuję tej metody.Tworzenie połączenia sqlite do pliku na dysku jest pozostawione jako ćwiczenie dla czytelnika ... ale teraz jest możliwe dwuwierszowe połączenie możliwe dzięki bibliotece pandas
źródło
df
więcpandas.read_csv(csvfile).to_sql(table_name, conn, if_exists='append', index=False)
Moje 2 centy (bardziej ogólne):
źródło
.import
Komenda jest cechą narzędzia wiersza polecenia sqlite3. Aby to zrobić w Pythonie, należy po prostu załadować dane przy użyciu dowolnych funkcji, które ma Python, takich jak moduł csv , i wstawić dane w zwykły sposób.W ten sposób masz również kontrolę nad tym, jakie typy są wstawiane, zamiast polegać na pozornie nieudokumentowanym zachowaniu sqlite3.
źródło
źródło
Wielkie dzięki za odpowiedź Berniego ! Musiałem to trochę poprawić - oto, co zadziałało dla mnie:
Mój plik tekstowy (PC.txt) wygląda następująco:
źródło
Masz rację,
.import
to jest właściwy sposób, ale to polecenie z powłoki SQLite3.exe. Wiele najpopularniejszych odpowiedzi na to pytanie dotyczy natywnych pętli Pythona, ale jeśli twoje pliki są duże (moje to 10 ^ 6 do 10 ^ 7 rekordów), nie chcesz czytać wszystkiego w pandach lub używać natywnego rozumienia / pętli list Pythona (chociaż nie czas na ich porównanie).W przypadku dużych plików uważam, że najlepszą opcją jest wcześniejsze utworzenie pustej tabeli za pomocą
sqlite3.execute("CREATE TABLE...")
, usunięcie nagłówków z plików CSV, a następnie użyciesubprocess.run()
do wykonania instrukcji importu sqlite. Ponieważ ostatnia część jest, moim zdaniem, najbardziej trafna, zacznę od tego.subprocess.run()
Wyjaśnienie
W wierszu poleceń szukane polecenie to
sqlite3 my.db -cmd ".mode csv" ".import file.csv table"
.subprocess.run()
uruchamia proces wiersza poleceń. Argument dosubprocess.run()
jest sekwencją ciągów, które są interpretowane jako polecenie, po którym następują wszystkie jego argumenty.sqlite3 my.db
otwiera bazę danych-cmd
Flaga po bazie danych pozwala na przekazywanie wielu poleceń do programu sqlite. W powłoce każde polecenie musi być w cudzysłowach, ale tutaj wystarczy, że będzie to ich własny element sekwencji'.mode csv'
robi to, czego można się spodziewać'.import '+str(csv_file).replace('\\','\\\\')+' <table_name>'
to polecenie importu.Niestety, ponieważ podproces przekazuje wszystkie następstwa
-cmd
jako łańcuchy cytowane w cudzysłowie, musisz podwoić ukośniki odwrotne, jeśli masz ścieżkę do katalogu systemu Windows.Usuwanie nagłówków
Właściwie nie jest to główny punkt pytania, ale oto, czego użyłem. Ponownie, w żadnym momencie nie chciałem wczytywać całych plików do pamięci:
źródło
Oparty na rozwiązaniu Guy L (Love it), ale radzi sobie z uciekłymi polami.
źródło
Możesz to zrobić za pomocą
blaze
&odo
efektywnieOdo będzie przechowywać plik csv w
data.db
(bazie danych sqlite) w ramach schematudata
Lub używasz
odo
bezpośrednio, bezblaze
. Każdy sposób jest w porządku. Przeczytaj tę dokumentacjęźródło
Jeśli plik CSV musi zostać zaimportowany jako część programu w języku Python, to dla uproszczenia i wydajności można użyć
os.system
następujących wskazówek:Chodzi o to, że podając nazwę pliku bazy danych, dane zostaną automatycznie zapisane, przy założeniu, że nie ma błędów w ich odczytaniu.
źródło
źródło
ze względu na prostotę możesz użyć narzędzia wiersza poleceń sqlite3 z pliku Makefile twojego projektu.
make test.sql3
następnie tworzy bazę danych sqlite z istniejącego pliku test.csv z pojedynczą tabelą „test”. możesz następniemake test.dump
zweryfikować zawartość.źródło
Odkryłem, że może być konieczne podzielenie transferu danych z csv do bazy danych na fragmenty, aby nie zabrakło pamięci. Można to zrobić w następujący sposób:
źródło