我有一张约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的解决方案对我有用。需要每天运行此脚本以转储每日数据。
答案 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任务。