使用 Python 或 R 将非常大的 sql 文件导出到 csv
Posted
技术标签:
【中文标题】使用 Python 或 R 将非常大的 sql 文件导出到 csv【英文标题】:export very large sql file into csv with Python or R 【发布时间】:2016-02-01 17:04:26 【问题描述】:我有一个大的 sql 文件 (20 GB),我想将其转换为 csv。我打算将文件加载到 Stata 中进行分析。我有足够的内存来加载整个文件(我的电脑有 32GB 内存)
问题是:到目前为止,我使用 Python 在网上找到的解决方案 (sqlite3) 似乎需要比我当前系统更多的 RAM:
读取 SQL 写入 csv这里是代码
import sqlite3
import pandas as pd
con=sqlite3.connect('mydata.sql')
query='select * from mydata'
data=pd.read_sql(query,con)
data.to_csv('export.csv')
con.close()
sql 文件包含大约 15 个变量,可以是时间戳、字符串或数值。没什么特别的。
我认为一种可能的解决方案是读取 sql 并一次写入 csv 文件一行。但是,我不知道该怎么做(在 R 或 Python 中)
非常感谢任何帮助!
【问题讨论】:
你能发布你的 sql 文件的一小部分(非常小)吗?如果可能的话,还有你的 Python 或 R 代码 不幸的是我不能发布任何子集。但该文件包含各种变量(时间戳、带有任何字符的字符串(可能还有一些中文、数字等)。 @dickoa 看到我上面的编辑。谢谢! 您可以使用“编辑”按钮将代码粘贴到问题上,我认为在问题上更好。如果您不能发布文件的任何子集,那么 sql 文件的示例将帮助人们尝试回答和帮助您。 @dickoa 我正在尝试您的方法,但我收到以下错误 unicodeencodeerror: 'ascii' codec can't encode charater u'\xee' in position 1: ordinal not in range (128)。 ..你知道我应该怎么做吗? 【参考方案1】:在mysql数据库中加载.sql
文件并导出为CSV。
在 MySQL 数据库中加载 mysql 转储文件的命令。
创建一个 MySQL 数据库
create database <database_name>
mysqldump -u root -p <database_name> < dumpfilename.sql
将 MySQL 表导出为 CSV 的命令
mysql -u root -p
use <database_name>
SELECT * INTO OUTFILE 'file.csv'
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
FROM <table_name>;
【讨论】:
【参考方案2】:在 Windows cmd 行或 UNIX shell 中使用这样的 sqlite3 命令行程序:
sqlite3 -csv "mydata.sql" "select * from mydata;" > mydata.csv
如果 mydata.sql 不在当前目录中,则使用路径,在 Windows 上使用正斜杠而不是反斜杠。
交替运行 sqlite3
sqlite3
并在 sqlite 提示符下输入这些命令:
.open "mydata.sql"
.ouptut mydata.csv
.mode csv
select * from mydata;
.quit
(或者将它们放在一个名为run
的文件中,比如说,使用sqlite3 < run
。
【讨论】:
感谢 grothendieck,但您的解决方案对我来说有点太复杂了。如何用windows创建文件?我需要管理员权限吗(我没有)。为什么这个解决方案会克服我上面解释的问题?谢谢!! 您可以使用记事本创建文件,或者根本无法创建文件,只需手动将行键入 sqlite3。您不需要管理员权限。【参考方案3】:您可以批量读取 SQL 数据库并将它们写入文件,而不是一次读取整个数据库。感谢 How to add pandas data to an existing csv file? 了解如何添加到现有 CSV 文件。
import sqlite3
import pandas as pd
# Open the file
f = open('output.csv', 'w')
# Create a connection and get a cursor
connection = sqlite3.connect('mydata.sql')
cursor = connection.cursor()
# Execute the query
cursor.execute('select * from mydata')
# Get data in batches
while True:
# Read the data
df = pd.DataFrame(cursor.fetchmany(1000))
# We are done if there are no data
if len(df) == 0:
break
# Let's write to the file
else:
df.to_csv(f, header=False)
# Clean up
f.close()
cursor.close()
connection.close()
【讨论】:
我没有测试过代码,如果有什么问题请告诉我。 当然,不用担心。我会让你知道。再次感谢! 我正在尝试您的方法,但我收到以下错误 unicodeencodeerror: 'ascii' codec can't encode character u'\xee' in position 1: ordinal not in range (128)...你知道我该怎么做吗? 试试df.to_csv(f, header=False, encoding='utf-8')
。以上是关于使用 Python 或 R 将非常大的 sql 文件导出到 csv的主要内容,如果未能解决你的问题,请参考以下文章