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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

859閲覧

python:csvファイルを条件によって書き換えたいです

kero16

総合スコア9

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2020/03/26 01:03

前提・実現したいこと

csvファイルで、下記を追記した上で上書き保存したいと思っております。

・会社 → 「御中」を追記
・上記以外 → 「様」を追記

(1)追記まではできたと思うのですが、この内容を保存する方法がわかりませんでした。
教えていただければ幸いです。よろしくお願い致します。

(2)追記する条件を、「会社」があるか無いかではなく、
行(と呼んでよいのかわからないのですが)とすることは可能なのでしょうか。

たとえば、今回のcsvデータで「株式会社山田」と「田中花子」のみ
「さま」を追記したい場合、if文でどのように指定すれば良いのかわからず
こちらも教えていただければ有難いです。どうぞよろしくお願い致します。

該当のソースコード

csv

1 2お名前,電話番号,住所 3山田太郎,090-1233-4567,東京都 4株式会社山田,03-1111-2222,神奈川県 5田中花子,080-1233-4567,千葉県 6はな有限会社,045-111-2345,神奈川県 7Nancy,050-1234-5678,茨城県

python

1import csv 2 3with open('name.csv', "r") as f: 4 s = csv.reader(f) 5 h = next(csv.reader(f)) #ヘッダー(住所)をスキップ 6 for row in s: 7 name = row[0] 8 if '会社' in name: 9 name += ' 御中' 10 else: 11 name += ' 様'

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

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

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

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

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

magichan

2020/03/26 01:34

(2)の内容がよくわかりません 予め ['株式会社山田', '田中花子'] のようなデータを準備しておき、それに含まれている場合はと含まれない場合で処理を分けたいということですか?
kero16

2020/03/26 01:44

いえ、このname.csvで、 株式会社山田さま 田中花子さま それ以外はそのまま変更せずとしたい場合の指定方法を教えていただきたいと思いました。 実際に変更したいデータが違うため、わかりづらい例えになってしまって申し訳ありません。 よろしくお願い致します。
magichan

2020/03/26 02:10

やはりよくわかりません 「株式会社山田」と「田中花子」の2行にのみ「さま」をつけたいのはわかったのですが、その2行はどのように(どのような条件で)指定したいのでしょうか。
kero16

2020/03/26 02:15

「株式会社山田」と「田中花子」は例えでして、 条件を「行」指定にすることは可能かどうかをお聞きしたかったのです。 (このcsvでいえば、3行目と4行目の「お名前」という風に) 「行」という言い方が合っているのかわならなかったため、例えを出してしまったのですが よけいわかりづらいことになってしまってすみません。
magichan

2020/03/26 02:19

やっと理解しました。行番号で指定したいということですね。
kero16

2020/03/26 02:21

行番号という言い方なのですね! そうなのです。よろしくお願い致します。
guest

回答1

0

ベストアンサー

(1) データの保存方法
変更したデータを2次元リストに格納していき、csv.writer() を使って書き込みを行うとよいです

Python

1import csv 2 3# 変更したデータを格納するリスト 4data = [] 5with open('name.csv', "r") as f: 6 reader = csv.reader(f) 7 header = next(reader) 8 # ヘッダ行をdataに格納する 9 data.append(header) 10 for row in reader: 11 name = row[0] 12 if '会社' in name: 13 row[0] += ' 御中' 14 else: 15 row[0] += ' 様' 16 # 変更した行データをdataに格納する 17 data.append(row) 18 19# データ書き込み部 20with open('new_name.csv', "w") as f: 21 writer = csv.writer(f) 22 writer.writerows(data)

(2) 行番号を指定してデータを変更する方法
CSVデータの行毎にループ処理をする際に enumerate() を使って現在何行目を処理を行っているかをカウントして、その値を条件に処理を行うと良いかと思います。

Python

1import csv 2 3data = [] 4with open('name.csv', "r") as f: 5 reader = csv.reader(f) 6 header = next(reader) 7 data.append(header) 8 # noに行番号が入ります(行番号は1からスタートとします) 9 for no, row in enumerate(reader, start=1): 10 name = row[0] 11 # no が 2と3のときのみに処理を行います。 12 if no in [2,3]: 13 row[0] += ' さま' 14 data.append(row) 15 16with open('new_name.csv', "w") as f: 17 writer = csv.writer(f) 18 writer.writerows(data)

一応補足として。。
この手の処理でしたら、pandas を使うことで簡単に書けますのでオススメしておきます。

(1)

Python

1import pandas as pd 2 3df = pd.read_csv('name.csv') 4df.loc[df['お名前'].str.contains('会社'), 'お名前'] += ' 御中' 5df.loc[~df['お名前'].str.contains('会社'), 'お名前'] += ' 様' 6df.to_csv('new_name.csv', index=False)

(2)

Python

1import pandas as pd 2df = pd.read_csv('name.csv') 3df.loc[[1,2], 'お名前'] += ' さま' 4df.to_csv('new_name.csv', index=False)

(pandasの場合index値は0から開始なので[1,2]となります)

投稿2020/03/26 02:51

編集2020/03/26 03:03
magichan

総合スコア15898

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

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

kero16

2020/03/26 03:20

ありがとうございます! (1)(2)ともに求めていた書き換えができました!! またpandasを使う方法も教えてくださいましてありがとうございます。 やり方を検索していた時に、よく出てきた名前でしたが理解できなかったところ 実際にやりたかった内容をコードにしていただいたので、改めて勉強したいと思います。 pandasのインストールも無事できました。 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問