質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

2回答

5104閲覧

Python データベースからソートしてCSVに書き込みたい

icemanstanding

総合スコア73

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2020/08/05 04:11

test.dbからNoでソートした順番でデータを抽出し、
その順番でtest2.csvに書き込みたいのですが、
普段はpandasのDataframeを使っているので、例文を探しても見つかりません。

解決方法のアドバイスをお願いします。

コード

conn = sqlite3.connect('./temp/test.db') c = conn.cursor() with open ('./temp/test2.csv',"w", encoding="utf-8") as f: for row in c.execute('SELECT * FROM test ORDER BY No DESC'): f.write(row) conn.close()

エラーメッセージ

TypeError: write() argument must be str, not tuple

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

stdio

2020/08/05 05:39

ソートぐらい、自身で実装しましょう。
icemanstanding

2020/08/05 05:48

ご指摘ごもっとも。プログラム初めて6カ月。pandasに頼り切っていたのでこのありさまですよ・・・
stdio

2020/08/05 06:00

私も結構辛辣なことを言ってしまったなと思っています。はい... エラーの内容としては、「引数はtupleではなく str でなければなりません。」と書かれています。 rowの中身がtupleなのでしょう。型を良く調べてから質問すれば、このような意見は返ってこなくなりますよ。
yureighost

2020/08/05 06:31

DataFrame形式からcsvに書き出すこともできたと思いますが、 そちらは使えない理由があるのでしょうか。
dameo

2020/08/05 06:34

ソートはSQL内で降順ですが実施されているようです。 stdioさんがおっしゃるとおり、rowはSELECT句で指定した*の各カラムのタプルになっています。 カンマでjoinする必要がありますが、カラムの値にCSVでエスケープが必要な文字があるならクォートやエスケープをしてください。
icemanstanding

2020/08/05 06:47

yureighost様 今はプログラム中ですが、本番は8GBのデータベースを処理する必要があるため、 Dataframe形式に格納しようとするとメモリーエラーが生じてしまうので、1行ずつ処理する方法を検討しています。
icemanstanding

2020/08/05 06:56

conn = sqlite3.connect('./temp/test.db') c = conn.cursor() with open ('./temp/rawdata_sorted2.csv',"w",newline='', encoding="utf-8") as f: for row in c.execute('SELECT * FROM test ORDER BY VIN_NUM ASC'): l = str(row) f.write(l) conn.close() で実行してみましたが、データベースが真横に並んでいて、イメージと違いました。 根本から間違っているようです。
stdio

2020/08/05 06:58

改行コードを入れていないから、横並びになるんですよ... l = str(row) + '\n' で改行が入ったはずです。
guest

回答2

0

import csv import sqlite3 conn = sqlite3.connect('./temp/test.db') c = conn.cursor() with open ('./temp/rawdata_sorted.csv',"w",newline='', encoding="utf-8") as f_handle: writer = csv.writer(f_handle) header = [ 'KB','VIN_NUM','MODEL_CD','DATA_YMD','M2M_REPORT_ID','M2M_REPORT_ID_SUB','M2M_REPORT_ROW_ID','M2M_REPORT_COL_ID','CALC_VAL'] writer.writerow(header) for row in c.execute('SELECT * FROM hoge ORDER BY VIN_NUM ASC,MODEL_CD ASC,DATA_YMD ASC,M2M_REPORT_ID ASC,M2M_REPORT_ID_SUB ASC,M2M_REPORT_ROW_ID ASC,M2M_REPORT_COL_ID ASC,M2M_REPORT_COL_ID ASC,CALC_VAL ASC'): writer.writerow(row) conn.close()

投稿2020/08/05 08:05

編集2020/08/06 07:20
icemanstanding

総合スコア73

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

csvにするならカンマ区切りでないといけないので、
row内のcolumnの値を処理する必要があると思います。
rowはfor文で処理することでcolumnをそのまま取り出せますので、
それをリスト内包表記でリストにしてしまいjoinで
区切り文字をカンマに指定して結合するのが一番楽だと思います。
またテーブル内に数値型の項目があるとそのまま結合できないためstrで文字列変換しています。

python

1import sqlite3 2 3conn = sqlite3.connect('./temp/test.db') 4c = conn.cursor() 5 6with open ('./temp/test2.csv',"w", encoding="utf-8") as f: 7 for row in c.execute('SELECT * FROM test ORDER BY No DESC'): 8 f.write(','.join([str(c) for c in row]) + '\n') 9 10conn.close()

投稿2020/08/05 07:15

yureighost

総合スコア2183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問