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

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

ただいまの
回答率

87.51%

Pythonで複数のCSVファイルのデータをテンプレートに差し込みたい

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 80

score 1

実現したいこと

Pythonで、csvファイルからデータを抽出し、テンプレートに差し込んだうえでtxtファイルとして保存するコードを作成しました。
応用として、今度は2つのcsvファイルからデータを抽出してテンプレートに差し込むコードを作りたいです。

元のコードはこんな感じです。

import csv

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

items = {}
template = '''
{姓}  {名}様

株式会社〇〇の××です。
{振込月日}に振り込ませていただく給与について
明細(毎月末日締 翌月25日払)をお送りします。

以下略

'''

for items in f:
   filename = '{姓}{名}様.txt'.format(**items)
   f = open(filename, 'x')
   f.write(template.format(**items))
f.close()

csv_file.close()

このコードのテンプレート部分の、「株式会社〇〇の××です。」など、基本の文章になる部分を2つめのcsvファイルにカラム付きのデータとして保存して、差し込めるようにしたいです。
理想のテンプレートは以下のような形になります。

template = '''
{姓}  {名}様

{1行目}
{振込月日}{2行目}
{3行目}

以下略

'''

どうぞ知恵をお貸しください。よろしくお願いいたします。

2つのcsvデータ

1.顧客データの入ったcsv(meisai_data.csv)

姓,名,振込月日
田中,太郎,624日
山田,花子,624日
佐藤,次郎,624

2.明細の本文をcsv形式にしたもの(hinagata.csv)

1行目,2行目,3行目
株式会社〇〇の××です。,に振り込ませていただく給与について,明細(毎月末日締 翌月25日払)をお送りします。

試したこと

素人考えですが、globを使うと良いのかと思い、以下のようにコードを書き換えました。

import csv
import glob

file = glob.glob('./*csv')
csv_file = open(file, "r", encoding="utf-8", errors="", newline="" )
#辞書形式
f = csv.DictReader(csv_file, delimiter=",", doublequote=True, lineterminator="\r\n", quotechar='"', skipinitialspace=True)


実行すると以下のようなエラーが出ました。

TypeError       (note: full exception trace is shown but execution is paused at: <module>)
expected str, bytes or os.PathLike object, not list


このエラーが解消されれば上手くいくのでしょうか?

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • TakaiY

    2021/10/14 13:13

    1つめのCSV(客のデータ?)と2つめのCSV(こちらのデータ?)の関係がよくわかりません。
    具体的な例を示してください。

    1つめのCSVのデータの1行目と 2つめのCSVのデータの1行目が対応しているとかですか?

    キャンセル

  • hhh-ds

    2021/10/14 15:03

    2つのCSVデータは対応関係にありません。
    質問内容を修正しましたのでご確認ください。

    キャンセル

回答 1

0

globは、撮り貯めた写真を日付ごとに整理したいなど、不特定多数のファイルがそれらのファイル名を一覧で取得したい場合などに使います。
今回のようにファイル名が決まっているのであれば不使いません。将来顧客データのファイルが複数になったりしたら使えるかもしれません)

ファイルの中身のデータは、現状のように読込みながら処理する(with openの中でforで回す)こともできますが、リストに読み込んでしまうこともできます。
hinagata.csvの方は読み込んでしまうのが扱いやすそうです。

with open('hinagata.csv', encoding='utf-8') as h:
    reader = csv.DictReader(h)
    hinagata = list(reader)


これで、hinagata.csvの内容が取得できます。
ここで、hinagata変数がdictのリストであることに注意してください。
printで表示してみるといいでしょう。
1行目を取り出したければ、

hinagata_1 = hinagata[0]


などとします。リストの扱いに慣れているのであれば、ここで置き換える必要はありません。

取得できたので、出力に使うことができます。
ここで作ったhitagata_1をformatの引数に追加してあげればOKです。

template = '''
{姓}  {名}様

{1行目}
{振込月日}{2行目}
{3行目}
'''

for items in f:
   filename = '{姓}{名}様.txt'.format(**items)
   f = open(filename, 'w')
   f.write(template.format(**items, **hinagata_1))
   f.close()

csv_file.close()


★ f.close()の場所が間違えています。 元のコードだと最後のファイルしかクローズできません。 close漏れなど防ぐためには、with構文を使いましょう。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.51%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る