आप सही हैं कि .import
जाने का रास्ता है, लेकिन यह SQLite3.exe शेल से एक कमांड है। इस प्रश्न के बहुत से शीर्ष उत्तरों में देशी पायथन लूप शामिल हैं, लेकिन यदि आपकी फाइलें बड़ी हैं (मेरा 10 ^ 6 से 10 ^ 7 रिकॉर्ड है), तो आप पंडों में सब कुछ पढ़ने या देशी अजगर सूची बोध / पाश का उपयोग करने से बचना चाहते हैं। (हालांकि मैंने उनकी तुलना के लिए समय नहीं दिया)।
बड़ी फ़ाइलों के लिए, मेरा मानना है कि सबसे अच्छा विकल्प पहले से खाली तालिका बनाना है 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
उद्धृत स्ट्रिंग्स के रूप में पास करता है, अगर आपको विंडोज़ निर्देशिका पथ है तो आपको अपने बैकस्लैश को दोगुना करना होगा।
धारीदार हेडर
वास्तव में सवाल का मुख्य बिंदु नहीं है, लेकिन यहां मैंने जो उपयोग किया है। फिर, मैं किसी भी बिंदु पर पूरी फ़ाइलों को स्मृति में नहीं पढ़ना चाहता था:
with open(csv, "r") as source:
source.readline()
with open(str(csv)+"_nohead", "w") as target:
shutil.copyfileobj(source, target)