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

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

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

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

Python

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

Q&A

解決済

2回答

1541閲覧

Pythonでcsvのデータをtxt形式のテンプレートに流し込みたい

hhh-ds

総合スコア2

CSV

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

Python

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

0グッド

0クリップ

投稿2021/10/07 06:52

編集2021/10/07 07:16

前提・実現したいこと

初めて質問します。不備などありましたらお許しください。

Pythonを使ってcsvファイルのデータをtxtファイル形式のテンプレートに流し込む作業をしようとしています。
「Python csv txt 流し込み」などで検索をしましたが、思う回答が見つかりませんでした。
間にjsonファイルを挟むなどの工程が必要なのかと思ったのですが、挟んだりせずそのままtxtファイルにデータを流し込むことは可能なのでしょうか?

流し込みたいtxtのテンプレート

以下の<>の部分にcsvのデータを流し込みたいです。

<名前> 様

<振込月日>に振り込ませていただく給与について明細をお送りします。

─────────
<明細対象年月>支給明細
─────────
●<案件名1> 案件分
雇用形態:<雇用形態1>
日数:<就業日数1>日
給与:\<給与1>/日
手当:\<手当1>/日
(1)支給総額: \<支給総額1>-
(2)源泉税額:△\<源泉税額1>-
(3)振込金額: \<振込金額1>- (1)-(2)

●<案件名2> 案件分
雇用形態:<雇用形態2>
日数:<就業日数2>日
給与:\<給与2>/日
手当:\<手当2>/日
(1)支給総額: \<支給総額2>-
(2)源泉税額:△\<源泉税額2>-
(3)振込金額: \<振込金額2>- (1)-(2)

以上、ご確認の程、よろしくお願いします。

試したこと

以下のページを参考にして、csvファイルを読み込むこと自体には成功しております。
https://qiita.com/wiwi7373/items/c4b2b9ef02ae0f970843

補足情報(FW/ツールのバージョンなど)

Pythonのバージョンは3.9.7を使用しています

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

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

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

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

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

can110

2021/10/07 07:08

テンプレートの書式(仕様)によりますので、それを示してください。
TakaiY

2021/10/07 07:11

「csvファイルのデータをtxtファイル形式のテンプレートに流し込む」というのはどういう意味でしょう? 具体例を示していただけなければアドバイスしようがありません。
can110

2021/10/07 07:24

csvファイルのデータと<>の部分がどのような対応関係になっているのかを示してください。
guest

回答2

0

ベストアンサー

pythonでは、文字列の中に置換対象の埋め込むことができます。
いくつか方法がありますが、一例としては以下のような感じ。

python

1items = {"name": "悟空", "age": 3} 2 3template = ''' 4こんにちは。 名前は{name}。 5今{age}歳です。 6''' 7 8print(template.format(**items))

これを実行すると、以下の出力になります。

text

1こんにちは。 名前は悟空。 2今3歳です。

テンプレートは'''でくくると、複数行の文字列が表しやすくなります。

itemsにあたるデータはcsvから読んでくることになりますが、csv.DictReaderを使えば、列ごとにカラム名をキーとしたdictが得られるのでそのまま使えます。
pandasを使ってもできるでしょう。

もっと込み入ったテンプレートを利用したいのであれば、jinja2あたりを使うと、繰り返しや条件分岐なども表現できますが、今回はそこまで必要ではなさそうですね。


だいぶ進みましたね。
質問のコードはまだ途中で、もうひといきです。
参考にされたサイトのここにある説明のデータ抽出方法のところの処理までやらないと、データが出てきません。

まずは、今回のテンプレートへの差し込みでは、辞書形式でデータを取り出すので、リスト形式は不要です。

python

1import csv 2 3csv_file = open("meisai_data.csv", "r", encoding="utf-8", errors="", newline="" ) 4#辞書形式 5f = csv.DictReader(csv_file, delimiter=",", doublequote=True, lineterminator="\r\n", quotechar='"', skipinitialspace=True)

いろいろオプションが付いていますが、出力結果が適当でない場合はここを調整する必要があるかもしれません。 まずは何もつけないでやってもいいかもしれませんね。

ポイントはこの「f」がリーダーなので、for文で回すと1行ずつ取りだすことができるってところです
まずは、内容がちゃんととりだせるかどうか確認します。

python

1for items in f: 2 print(items)

こうすると、csvの内容が、辞書形式で表示されるのがわかると思います。
辞書形式で19個の項目がでてきていればいいでしょう。 こまかいところまで確認できればなおよいです。

問題なければ、差し込んでみます。
できあがるコードはこんな観じでしょうね。

python

1import csv 2 3csv_file = open("meisai_data.csv", "r", encoding="utf-8", errors="", newline="" ) 4#辞書形式 5f = csv.DictReader(csv_file, delimiter=",", doublequote=True, lineterminator="\r\n", quotechar='"', skipinitialspace=True) 6 7template = ''' 8こんにちは。 名前は{姓}。 9今{名}歳です。 10''' 11 12for items in f: 13 print(template.format(**items) 14 15csv_file.close()

うまくいったでしょうか?。 余計な「"」とかが入っているかもしれません。そういう場合はDictReaderのパラメータを調整するといいかもしれません。


ファイルへの出力については、web上にたくさんの情報がありますから、それを参考にしてつくってみるのがいいと思います。
慣れればなんということはありませんが、ファイルへの書き込みも、 ファイル名の生成もそれほど簡単ではありません。

きっかけとして、手順を書くと

  • for文の中で実施
  • ファイル名を生成する
    csvに姓と名が入っているのであれば、 filename = '{姓}_{名}様.txt'.format(**items)で作れるでしょう。
  • ファイルを書き込み権限でopenする
    withを使うと便利
  • 開いたファイルに文字列 を書き込み。

こんな感じでしょう。

投稿2021/10/07 07:48

編集2021/10/11 06:03
TakaiY

総合スコア13790

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

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

hhh-ds

2021/10/08 02:24

丁寧な回答をありがとうございます。 今回のcsvファイルは列が19列、行がヘッダーも含めて4列あるので、計3人分の明細書を作る作業になっております。 items = の欄には、19列分のカラム名を定義する必要があるということでしょうか?
TakaiY

2021/10/08 02:56

差し込む項目が19、もしくは、csvのカラムが19あるのであればそのとおりです。 ですが、すでにカラム名付きのcsvがあるのであれば、手で作る必要はなく、回答に書いた方法で作ることができますよ。
hhh-ds

2021/10/08 07:01 編集

ご返答感謝します。 今回のcsvファイルはカラム付きのため、以下のページも参考にしつつ、各カラムに対応させた形でデータを抽出するところまでは上手くいきました。 https://qiita.com/motoki1990/items/0274d8bcf1a97fe4a869 TakaiY様のコードをそのままお借りする形で、上記で作成したものと合わせて以下のようなコードを作ってみました。 ------------ import csv csv_file = open("meisai_data.csv", "r", encoding="utf-8", errors="", newline="" ) #リスト形式 f = csv.reader(csv_file, delimiter=",", doublequote=True, lineterminator="\r\n", quotechar='"', skipinitialspace=True) #辞書形式 f = csv.DictReader(csv_file, delimiter=",", doublequote=True, lineterminator="\r\n", quotechar='"', skipinitialspace=True) items = {} template = ''' こんにちは。 名前は{姓}。 今{名}歳です。 ''' print(template.format(**items)) --------------- ("姓"、"名"はcsvファイル内のカラム名をそのまま使っています。) 実行したところ、KeyError: '姓' とエラーが表示されました。やはり item = 以降が空欄であることが原因でしょうか…?
hhh-ds

2021/10/11 01:50

追記ありがとうございます!上手くいきました! あとはtxtファイルに出力して保存したいのですが、そのコードがわかりません。 ファイル名は「{姓}+{名}+'様.txt'」のようにしたいです。
hhh-ds

2021/10/11 06:01

ありがとうございます!おかげさまでコードが完成いたしました。感謝してもしきれません 丁寧に教えていただき、本当にありがとうございました!
guest

0

csvの列数は幾つがありますか?一列なら,下のコードで行けると思います.

python

1with open('パス.txt', 'w') as f: 2 for i in df['列名']: 3 f.write("%s\n" % i)

ーーー更新ーーー
Stack OverFlowで次の方法を見つけました

https://stackoverflow.com/questions/47339698/how-to-convert-csv-file-to-text-file-using-python

python

1import csv 2csv_file = raw_input('Enter the name of your input file: ') 3txt_file = raw_input('Enter the name of your output file: ') 4with open(txt_file, "w") as my_output_file: 5 with open(csv_file, "r") as my_input_file: 6 [ my_output_file.write(" ".join(row)+'\n') for row in csv.reader(my_input_file)] 7 my_output_file.close()

投稿2021/10/07 07:02

編集2021/10/07 07:14
Eurus

総合スコア15

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

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

hhh-ds

2021/10/07 07:08

回答ありがとうございます。 列は19列あります。ちなみに行はヘッダーも含め4行になります。(中には値が空白のものも存在します)
Eurus

2021/10/07 07:14

なるほど,回答を更新しました.
hhh-ds

2021/10/08 02:11

追記ありがとうございます。 回答いただいたコードを実行してみたところ、以下のエラーが発生しました。 NameError: name 'raw_input' is not defined 他の質問者様に寄せられた解答を調べましたが、raw_inputを定義づけする必要があるのでしょうか?その方法がよくわかりません。 勉強不足で申し訳ないです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問