Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PythonCSV到SQLite_Python_Csv_Sqlite - Fatal编程技术网

PythonCSV到SQLite

PythonCSV到SQLite,python,csv,sqlite,Python,Csv,Sqlite,我正在“转换”一个大的(~1.6GB)CSV文件,并将CSV的特定字段插入SQLite数据库。基本上,我的代码如下所示: import csv, sqlite3 conn = sqlite3.connect( "path/to/file.db" ) conn.text_factory = str #bugger 8-bit bytestrings cur = conn.cur() cur.execute('CREATE TABLE IF NOT EXISTS mytable (field2

我正在“转换”一个大的(~1.6GB)CSV文件,并将CSV的特定字段插入SQLite数据库。基本上,我的代码如下所示:

import csv, sqlite3

conn = sqlite3.connect( "path/to/file.db" )
conn.text_factory = str  #bugger 8-bit bytestrings
cur = conn.cur()
cur.execute('CREATE TABLE IF NOT EXISTS mytable (field2 VARCHAR, field4 VARCHAR)')

reader = csv.reader(open(filecsv.txt, "rb"))
for field1, field2, field3, field4, field5 in reader:
  cur.execute('INSERT OR IGNORE INTO mytable (field2, field4) VALUES (?,?)', (field2, field4))
一切都按照我的预期运行除了。。。这需要花费大量的时间来处理。我是不是编错了?有没有更好的方法来实现更高的性能并完成我所需要的(只需将CSV的几个字段转换为SQLite表)


**编辑——我尝试按照建议将csv直接导入sqlite,但结果发现我的文件在字段中有逗号(例如,
“我的标题,逗号”
)。这会在导入时产生错误。这些事件太多,无法手动编辑文件


任何其他想法???**

可以直接导入CSV:

sqlite> .separator ","
sqlite> .import filecsv.txt mytable

尝试使用事务

begin    
insert 50,000 rows    
commit
这将定期提交数据,而不是每行提交一次。

克里斯是正确使用事务的人;将数据分成块,然后存储

"... 除非已经在事务中,否则每个SQL语句都会为其启动一个新事务。这非常昂贵,因为它需要重新打开、写入和关闭每条语句的日志文件。这可以通过使用BEGIN事务包装SQL语句序列来避免;交易结束;声明。对于不改变数据库的语句,也可以获得这种加速。”-来源:

“。。。您可以使用另一个技巧来加速SQLite:事务。每当您必须执行多个数据库写入时,请将它们放在一个事务中。不是每次发出写查询时都写入(并锁定)文件,而是在事务完成时写入只发生一次。“-来源:

如前所述(Chris和Sam),事务确实提高了很多插入性能

请允许我推荐另一个选项,使用一套Python实用程序来处理CSV

要安装:

pip install csvkit
来解决你的问题

csvsql --db sqlite:///path/to/file.db --insert --table mytable filecsv.txt

Pandas可以轻松地将大文件分块加载到数据库中。将CSV文件读入Pandas数据框,然后使用Pandas SQL编写器(这样Pandas就可以完成所有繁重的工作)。下面介绍如何将数据分块加载到100000行

将熊猫作为pd导入
orders=pd.read\u csv('path/to/your/file.csv')
TOORDERS.to_sql('orders',conn,如果_exists='append',index=False,chunksize=100000)

现代熊猫版本的性能非常好。不要重新发明轮子。有关更多信息,请参阅。

这是一个大文件。需要多长时间?有多少重复记录?如果有很多,保留已插入的记录的本地
集,并完全跳过对dup的SQL调用可能会更快有一些MySQL批量加载速度提示。您使用的是什么操作系统和Python版本?”这些提示太多,无法手动编辑文件。。”“让我们想想。太多而无法手动更改?如果您有一种编程语言,允许您编写一个程序,将CSV文件重新格式化为制表符分隔的文件就好了。有什么想法可以用什么语言来编写这样的程序吗?似乎没有默认的内置转义方法。此外,引号将是字符串中的文字。使用CSV解析更改文本并使用不同的分隔符输出可能是有意义的,但这可能会首先破坏使用导入工具的目的。请尝试:.mode CSV而不是.separator,请参阅:另一个遵循此代码的用户在尝试将
len()
与CSV读取器一起使用时遇到问题:
csvsql --db sqlite:///path/to/file.db --insert --table mytable filecsv.txt