আপনি ঠিক বলেছেন .import
সেটাই, তবে এটি এসকিউএলআইটিএসএক্স শেলের একটি কমান্ড। এই প্রশ্নের শীর্ষস্থানীয় উত্তরগুলিতে নেটিভ পাইথন লুপগুলি জড়িত, তবে যদি আপনার ফাইলগুলি বড় হয় (আমার 10 ^ 6 থেকে 10 ^ 7 রেকর্ড হয়), আপনি পান্ডাসে সমস্ত কিছু পড়তে বা নেটিভ পাইথন তালিকার বোঝা / লুপ ব্যবহার এড়াতে চান (যদিও আমি তুলনার জন্য তাদের সময় নিই না)।
বড় ফাইলগুলির জন্য, আমি বিশ্বাস করি যে সর্বোত্তম বিকল্পটি হ'ল আগাম খালি টেবিলটি তৈরি করে sqlite3.execute("CREATE TABLE...")
আপনার সিএসভি ফাইলগুলি থেকে শিরোনামগুলি স্ট্রিপ করুন এবং তারপরে subprocess.run()
স্ক্লাইটের আমদানি বিবৃতি কার্যকর করতে ব্যবহার করুন । যেহেতু শেষ অংশটি আমি সর্বাধিক প্রাসঙ্গিক বিশ্বাস করি, আমি এটি দিয়েই শুরু করব।
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
ডাটাবেস পরে ফ্ল্যাগ আপনাকে স্ক্লাইট প্রোগ্রামে কমান্ডে একাধিক অনুসরণ করতে দেয়। শেলটিতে প্রতিটি কমান্ডের উদ্ধৃতি থাকতে হবে, তবে এখানে তাদের ক্রমের নিজস্ব উপাদান হওয়া দরকার
'.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)