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

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

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

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2650閲覧

SQLITEから読み取ったデータをテキストファイルに書き込みたい

jyansinkai

総合スコア66

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/06/17 05:32

お世話になっております。
PYTHONを用い、SQLITEから読み取ったデータをテキストファイルに書かせようとしております。

PYTHON

1~略~ 2 3# データを1行読む 4sql='select * from jyoutai where bunsyo_no = ?' 5c.execute(sql,(bunsyo_no,)) 6result=c.fetchone() 7 8#jyoutai.txtにresultの内容を書き込む 9f = open('jyoutai.txt','a', encoding='UTF-8') 10f.writelines(result) 11f.close() 12 13~略~

resultには
('210603', 0, 0, 1, 0, 0, 0, '2021-06-17 14:26:46.404296')
という8つのデータが入っています。
これをjyoutai.txtというテキストファイルに書き込みたいのですが、
結果は
210603
と、最初の文字列だけがテキストファイルに書き込まれます。

どこを改善すべきか何卒ご教授下さいませ。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/06/17 06:02

実行したときに「TypeError: write() argument must be str, not int」みたいなエラーが発生していませんか?
bsdfan

2021/06/17 06:07

エラーが発生していませんか? writelines() は文字列のシーケンスを受け取るのですが、 result[1] は 0 という数値データが入っているので、そこでエラーが発生するはずです。
guest

回答1

0

ベストアンサー

resultには
( '210603', 0, 0, 1, 0, 0, 0, '2021-06-17 14:26:46.404296')
という8つのデータが入っています。

という事は、このコードだけではコレクションデータが回っていないので1行目だけが書き込まれているという事かと思います。(ここがこの回答の大きな誤り)

python

1f = open('jyoutai.txt','a', encoding='UTF-8') 2f.writelines(result) 3f.close()

resultをfor等で回してすべての要素をwritelines()してみてはいかがでしょうか?
(回っていたが、intを書き込もうとして処理に失敗していた)

追記

先の回答は誤っていたので修正します。(コメントの辻褄が合わなくなるので残します)
まずjyansinkaiさんには、何かエラーが出ませんでしたかと聞くのが良かったようです。

log

1Traceback (most recent call last): 2 File "test.py", line 6, in <module> 3 f.writelines(result) 4TypeError: write() argument must be str, not int

実際に確認できたエラーメッセージはこれでした。
jyansinkaiさんで起こっている問題がこれであれば、baitokunさん、bsdfanさんがの言う通り、
型を合わせて書き込めれば解決するかと思います。

log

1> py test.py 2Traceback (most recent call last): 3 File "test.py", line 6, in <module> 4 f.writelines(result) 5TypeError: write() argument must be str, not int 6 7> py test.py 8 9> type jyoutai.txt 102106032106030010002021-06-17 14:26:46.404296

まあ、テキストの中の文字がくっついちゃったんで、セパレータを指定する等ちょっと加工した方が良いかもですが(汗

baitokunさん、ご指摘ありがとうございました

投稿2021/06/17 05:49

編集2021/06/17 06:36
neonemo

総合スコア191

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

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

退会済みユーザー

退会済みユーザー

2021/06/17 06:25 編集

writelinesの引数に数値^^str型のシーケンス以外を指定するとTypeErrorが発生します。 質問のコードは、最初の1つ目の文字列を書き込んだあと、数値型のデータを書き込もうとしてエラーになり止まってしまっているのだと思われます。 (writelinesの引数に指定したresultすなわちsqlite3.Rowオブジェクトはイテラブルであり、writelinesはイテラブルを指定すればその要素を順次処理するので、イテラブルは「回っています」。ただしその要素が数値^^str型以外に該当した時点でTypeErrorが発生し処理が進んでいないだけです。 なので「resultをfor等で回してすべての要素をwritelines()」しても、最初の「'210603'」を書き込んだ後、数値を書き込もうとしてエラーで止まるはずです。 ``` f = open('jyoutai.txt','a', encoding='UTF-8') f.writelines(result) for r in result: f.writelines(r) ``` ↑は最初の210603しか書き込まれない。あとはエラーで止まる。 ※bsdfan氏のコメントに合わせて修正 「writelinesの引数に指定するべきはstr型のシーケンス」(Iterable[str]))
neonemo

2021/06/17 06:12

なるほど、指摘ありがとうございます。 検証して回答修正しますね・
neonemo

2021/06/17 06:41

>baitokunさん > なので「resultをfor等で回してすべての要素をwritelines()」しても、最初の「'210603'」を書き込んだ後、数値を書き込もうとしてエラーで止まるはずです。 確かにこちら確認できました。対処方法についても動作確認できました。 ありがとうございました。 勘で答えちゃダメですね。反省。。。
退会済みユーザー

退会済みユーザー

2021/06/17 06:42

こちらこそ横から失礼いたしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問