表題の件で質問お願い致します。
postgresqlのデータベースのテーブルにSELECT文を投げ、その結果をExcel(xlsxが理想)に出力させたいのですが方法が分からず悩んでいます。
使用しているモジュールはpsycopg2です。
以下該当のコードです
python
1import psycopg2 2 3conn = psycopg2.connect('dbname=postgres host=localhost user=postgres password=postgres') 4 5cursor = conn.cursor() 6 7# select文を実行 8sql = ("select * from testdata.prac_data") 9cursor.execute(sql) 10 11# 実行した結果を取得 12results = cursor.fetchall() 13 14cursor.copy_to(r'C:\Users\Desktop\test.xlsx', 'testdata.prac_data')
しかし実行すると以下のエラーが発生します。
python
1--------------------------------------------------------------------------- 2TypeError Traceback (most recent call last) 3<ipython-input-14-5244d5b0d003> in <module>() 4 13 results = cursor.fetchall() 5 14 6---> 15 cursor.copy_to(r'C:\Users\Desktop\test.xlsx', 'testdata.prac_data') 7 8TypeError: argument 1 must have a .write() method 9
自分なりにしらべてみたのですがwrite() methodというのが何を指しているのか分かりませんでした。
ファイルは実行するたび新規に作ってほしかったのでtest.xlsxは存在しない場合で実行しても上記と同じエラーが出ました。
何が原因か分からず悩んでいます。アドバイス頂きたいです。
また、要件がxlsxファイルでの出力なのでひとまずcsv形式で出力してから変換しても良いかなと考えているのでもっとほかのやり方もあれば教えてほしいです。
宜しくお願い致します。
--2018/11/27 追記--
pandasにread_sqlメソッドがあることを知りそちらを使ってみました
python
1import psycopg2 2import sys 3import pandas as pd 4import openpyxl 5 6# 接続情報 7connection_config = { 8 'host': 'localhost ', 9 'port': '5432', 10 'database': 'postgres', 11 'user': 'postgres', 12 'password': 'postgres' 13} 14 15# 接続 16connection = psycopg2.connect(**connection_config) 17 18# DataFrameでロード 19rentals = pd.read_sql(sql="SELECT * FROM testdata.prac_data;", con=connection) 20 21# 表示 22rentals 23 24rentals.to_excel(r'C:\Users\Desktop\test.xlsx')
ただ、これを実行すると以下のエラーが発生します
python
1TypeError: Excel doesn't support timezones in datetimes. Set the tzinfo in the datetime/time object to None or use the 'remove_timezone' Workbook() option
excelに出力する際に時間の情報は保持させたいのですが良い方法はありますでしょうか・・・
--再追記--
試しにcsvで出力しようとto_csvで出力し、欠損値が含まれているところには文字列’None’を入れる部分も追加したいと考え以下のコードを作成しました
python
1import psycopg2 2import sys 3import pandas as pd 4import openpyxl 5 6# 接続情報 7 connection_config = { 8 'host': 'localhost', 9 'port': '5432', 10 'database': 'postgres', 11 'user': 'postgres', 12 'password': 'postgres' 13 } 14 15 # 接続 16 connection = psycopg2.connect(**connection_config) 17 18 # DataFrameでロード 19 data = pd.read_sql(sql="SELECT * FROM testdata.prac_data;", con=connection) 20 21 # 欠損値→Noneに置き換え 22 data = data.fillna('None') 23 24 # 出力 25 data.to_csv(r'C:\Users\Desktop\test.csv' , encoding="SHIFT-JIS") 26 27 28 excel_output()
しかしこちらも
AttributeError: 'Timestamp' object has no attribute 'copy'
というエラーがdata = data.fillna('None')の部分で発生し行き詰ってしまいました・・・
xlsx形式、csv形式のどちらも将来使うことになるので可能であればこちらの対処法もご教授頂けたら嬉しいです。
回答1件
あなたの回答
tips
プレビュー