0

現在、CSV ファイルと mySQL データベースの間でデータをフォーマットする作業を行っています。MySQLdb ライブラリを使用して接続を管理していますが、フォーマットに問題があるようです。私は mySQL も Python もあまり経験していないことを認めなければなりませんが、実用的なアプローチで、今までほとんどうまくいっていました。

#!/usr/bin/python
# -*- coding: utf-8 -*-

import MySQLdb 

QUERY = "SELECT * FROM searches WHERE searchdate BETWEEN '2011-08-08' AND '2011-08-14';"
conn = MySQLdb.connect (unix_socket = '/opt/local/var/run/mysql5/mysqld.sock',host =      "localhost", user = "username", passwd= "passwd", db="db")
c = conn.cursor()
c.execute(QUERY)
for row in c.fetchall():
    print row

これは、データベースからレコードを抽出するスクリプトです。プロセスの後半で、各行からデータを抽出し、これを CSV にフォーマットしたいと考えていますが、当面の問題は、画面に出力されるデータが次のようになることです。

('\xc3\xa6nima', ' 1', ' 12782027', ' 35', datetime.date(2011, 8, 13))
('\xc3\xa6nima', ' 1', ' 12823616', ' 59', datetime.date(2011, 8, 10))
('\xc3\xa6oc', ' 1', ' 13078573', ' 55', datetime.date(2011, 8, 14))
('\xc3\xa6re', ' 1', ' 12516300', ' 35', datetime.date(2011, 8, 8))
('\xc3\xa6re v\xc3\xa6re deg', ' 1', ' 13145801', ' 59', datetime.date(2011, 8, 13))
('\xc3\xa6re v\xc3\xa6re deg og lammet', ' 1', ' 13145801', ' 59', datetime.date(2011, 8, 13))
('\xc3\xa6re v\xc3\xa6re jesu navn', ' 1', ' 13136667', ' 59', datetime.date(2011, 8, 11))
('\xc3\xa6rlig vuggevise', ' 1', ' 12386933', ' 35', datetime.date(2011, 8, 12))
('\xc3\xa6ror aleina', ' 1', ' 12867037', ' 35', datetime.date(2011, 8, 12))
('\xc3\xa6sj', ' 1', ' 13130891', ' 59', datetime.date(2011, 8, 8))
('\xc3\xa6thenor', ' 1', ' 12555673', ' 35', datetime.date(2011, 8, 10))

私が今理解しなければならない問題は、互換性のある形式でデータを取得する方法です。したがって、データベース内の文字セットにアクセスして UTF-8 に変更する方法と、すべてのデータを再構築する必要があるかどうか、またはこの問題を自動的に処理する方法があるかどうかを知りたいと思います。また、組み込み関数を使用して datatime.date をフォーマットする方法を誰かが教えてくれたら嬉しいです (正規表現と再構築ができることはわかっていますが、おそらくもっと洗練された解決策があるでしょう)。

よろしくお願いします。

4

3 に答える 3

1

私はMySQLdbに精通していませんが、次のようになります。

conn = MySQLdb.connect(unix_socket ='/opt/local/var/run/mysql5/mysqld.sock'、host = "localhost"、user = "username"、passwd = "passwd"、db = "db"、charset = "utf-8"

データベースがutf-8でも機能することを確認してください

pypdbcを使用すると、これは次のようになります。

import pyodbc
con = pyodbc.connect('DRIVER={MySQL ODBC 3.51 Driver};SERVER=localhost;DATABASE=db;UID=user;PWD=blabla',charset='utf8', init_command='SET NAMES UTF8')
cursor = con.cursor()
str=u'''INSERT INTO migdal_hist VALUES("","2011/03/01","0","בלהבלה","0",","0","0")'''
cursor.execute(str.encode('utf-8'))
con.commit()
于 2012-04-23T15:42:15.883 に答える
1

最初の列では、一部の文字が印刷できないため、16 進文字に変換されます。日時オブジェクトの最後の列。Python には、文字列に変換する strftime 関数が用意されています。

for row in c.fetchall():
    print row[0], row[1], row[2], row[3], row[4].strftime('%Y-%m-%d')

動作します。

また、次を使用してファイルに書き込むこともできます

file.write(",".join((row[0], row[1], row[2], row[3], row[4].strftime('%Y-%m-%d'))))

ここで、file はファイル オブジェクトです。コンマ区切りの列として書き込みます。ファイルを開くと、ファイル内の元の文字が表示されます。

于 2012-04-23T13:51:00.397 に答える
0

おそらく、次のようなことが必要です。

mysql = MySQLdb.connect(host = '...', [...] use_unicode = True)
cursor = mysql.cursor()
cursor.execute("SET NAMES 'utf8'")

試してみよう :)

于 2012-04-24T20:22:25.840 に答える