将MySQL表数据转储到csv并转换字符编码的最佳方法是什么?

时间:2018-04-13 09:44:36

标签: python mysql pandas csv unix

我有一张约200列的表格。我需要为ETL目的转储每日交易数据。它是一个MySQL数据库。我使用Python尝试使用pandas数据帧以及基本写入CSV文件方法。我甚至试图使用shell脚本寻找相同的功能。我使用sqlplus看到了一个这样的oracle数据库。以下是我的python代码,有两种方法:

使用熊猫:

import MySQLdb as mdb
import pandas as pd

host = ""
user = ''
pass_ = ''
db = ''

query = 'SELECT * FROM TABLE1'

conn = mdb.connect(host=host,
                   user=user, passwd=pass_,
                   db=db)

df = pd.read_sql(query, con=conn)
df.to_csv('resume_bank.csv', sep=',')

使用基本的python文件写:

import MySQLdb
import csv
import datetime

currentDate = datetime.datetime.now().date()

host = ""
user = ''
pass_ = ''
db = ''
table = ''

con = MySQLdb.connect(user=user, passwd=pass_, host=host, db=db, charset='utf8')
cursor = con.cursor()

query = "SELECT * FROM %s;" % table
cursor.execute(query)

with open('Data_on_%s.csv' % currentDate, 'w') as f:
    writer = csv.writer(f)
    for row in cursor.fetchall():
        writer.writerow(row)

print('Done')

该表有大约300,000条记录。它使用两个python代码花费了太多时间。

此外,编码存在问题。数据库结果集有一些拉丁字符,我可能会遇到一些错误:UnicodeEncodeError: 'ascii' codec can't encode character '\x96' in position 1078: ordinal not in range(128).

我需要以Unicode格式保存CSV。能否帮助我完成执行此任务的最佳方法。

基于Unix或基于Python的解决方案对我有用。需要每天运行此脚本以转储每日数据。

3 个答案:

答案 0 :(得分:2)

您可以通过MySql来实现这一目标。例如:

SELECT * FROM your_table WHERE...
INTO OUTFILE 'your_file.csv'
FIELDS TERMINATED BY ',' 
OPTIONALLY ENCLOSED BY '"'
FIELDS ESCAPED BY '\'
LINES TERMINATED BY '\n';

如果你需要安排你的查询将这样的查询放入一个文件(例如,csv_dump.sql),anche就像这样创建一个cron任务

00 00 * * * mysql -h your_host -u user -ppassword < /foo/bar/csv_dump.sql

答案 1 :(得分:2)

对于字符串,这将使用恰好是ASCII的默认字符编码,如果您有非ASCII字符,则会失败。你想要unicode而不是str。

rows = cursor.fetchall()
f = open('Data_on_%s.csv' % currentDate, 'w')
myFile = csv.writer(f)
myFile.writerow([unicode(s).encode("utf-8") for s in rows])
fp.close()

答案 2 :(得分:1)

您可以使用mysqldump执行此任务。 (Source for command

mysqldump -u username -p --tab  -T/path/to/directory dbname table_name --fields-terminated-by=',' 

参数如下:

  • -u username用于用户名
  • -p表示应使用密码
  • -ppassword通过命令行提供密码
  • --tab生成制表符分隔的数据文件

对于mor命令行开关,请参阅https://dev.mysql.com/doc/refman/5.5/en/mysqldump.html

要定期运行它,请创建一个像其他答案中所写的cron任务。