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
ソートぐらい、自身で実装しましょう。
ご指摘ごもっとも。プログラム初めて6カ月。pandasに頼り切っていたのでこのありさまですよ・・・
私も結構辛辣なことを言ってしまったなと思っています。はい...
エラーの内容としては、「引数はtupleではなく str でなければなりません。」と書かれています。
rowの中身がtupleなのでしょう。型を良く調べてから質問すれば、このような意見は返ってこなくなりますよ。
DataFrame形式からcsvに書き出すこともできたと思いますが、
そちらは使えない理由があるのでしょうか。
ソートはSQL内で降順ですが実施されているようです。
stdioさんがおっしゃるとおり、rowはSELECT句で指定した*の各カラムのタプルになっています。
カンマでjoinする必要がありますが、カラムの値にCSVでエスケープが必要な文字があるならクォートやエスケープをしてください。
yureighost様
今はプログラム中ですが、本番は8GBのデータベースを処理する必要があるため、
Dataframe形式に格納しようとするとメモリーエラーが生じてしまうので、1行ずつ処理する方法を検討しています。
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()
で実行してみましたが、データベースが真横に並んでいて、イメージと違いました。
根本から間違っているようです。
改行コードを入れていないから、横並びになるんですよ...
l = str(row) + '\n'
で改行が入ったはずです。
回答2件
あなたの回答
tips
プレビュー