🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
CSV

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

Python

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

Q&A

2回答

8216閲覧

Pythonでcsvファイルの特定の行の値を更新したい

kome1125

総合スコア0

CSV

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

Python

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

0グッド

0クリップ

投稿2021/01/28 16:00

編集2021/01/29 14:16

前提・実現したいこと

pythonでのcsv操作についての質問です。
inputで「好きな果物の名前」を取得し、'Name'カラムに果物の名前を、'Count'カラムにその果物の登場回数を
csvファイルに書き加えていくという処理を書こうとしています。
新たな果物を新規の行に書き込む処理はわかるのですが、「既存の果物の名前を取得したときにその行の'Count'を一つ増やすという処理」がどうしてもわかりません。

csv

1Name,Count 2Apple,1 3Banana,1 4Peach,1 5Orange,1

例えばinput()で'Orange'を取得した場合、

csv

1Name,Count 2Apple,1 3Banana,1 4Peach,1 5Orange,2

このように更新したいです。
今は標準ライブラリだけでやろうとしているのですが、サードパーティーのライブラリ使用などの選択肢も含めてどなたがご教授頂きたいです。
よろしくお願いいたします。

追記:

python

1fruit_name = input() 2fruit_name_title = furit_name.title() 3 4if os.path.exists('fruits_ranking.csv'): 5 with open('fruits_ranking.csv', 'r+', newline='') as f: 6 reader = csv.DictReader(f) 7 for i in reader: 8 if i['Name'] == fruit_name_title: 9 '......' 10 11else: 12 with open('fruits_ranking.csv', 'w', newline='') as f: 13 fieldnames = ['Name', 'Count'] 14 writer = csv.DictWriter, fieldnames=fieldnames) 15 writer.writeheader() 16 writer.writerow({'Name': fruit_name_title, 'Count': 1})

現状の説明が足りなくて申し訳ありません。
自分で考えた流れとしては、
・果物の名前を受け取る
・'fruits_ranking.csv'のファイルが存在するか調べる
・無ければファイルを新規で作り{'Name': fruit_name_title, 'Count': 1}を書き込む
・ファイルが存在する場合は各行をforループで回し、if i['Name'] == fruit_name_title:に引っかかった行に対して['Count']の更新はできないだろうかと考えていました。

一連の条件分岐に関しては一応機能するものを書けたのですが、csvの更新に関しては一度テキストファイルの形に変換してから部分的に上書きし、再度csvに反映させるなど考えてはみたのですが、実際にコードに起こせるだけの引き出しもなく行き詰ってしまいました。何かしらアドバイス頂けるとありがたいです。

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

Windows10
Python3
Pycharm

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

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

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

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

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

meg_

2021/01/29 01:41

> 「既存の果物の名前を取得したときにその行の'Count'を一つ増やすという処理」がどうしてもわかりません。 "既存の果物の名前"かどうかの判定は出来ていますか?
guest

回答2

0

inputが行われる毎にcsvファイルの一部を更新するのは非常に難しいです。csvファイルの1行の長さは決っていないので、ある部分だけを書き換えることが出来ないためです。

そこで、csvファイルを更新するような処理を行う場合は、プログラムの最初にcsvファイルを読み込んでおき、必要に応じてそれを変更しプログラムの最後でcsvファイルに書き込むのが普通です。

csvファイルを読み書きする方法としては、以下の方法があります。
0. テキストファイルとして読み込み、","で区切って要素を取り出し、テキストファイルとして書き出す。数字は自分で変換する。データ形式も自分で決める。
0. csvモジュールのreaderやwriterを使って読み書きする。数字は自分で変換する。データ形式は通常はリストのリストを使う。
0. numpyモジュールのloadtxt、savetxtを使う。今回のように、文字列と数字の両方が含まれる場合は、genfromtxtで読み込む。数字は自動的に変換される。データ形式はStructured arrayとなる。
0. pandasモジュールのread_csvやto_csvを使う。数字は自動的に変換される。データ形式はデータフレームとなる。

pythonの基礎を理解したいならテキストファイル方式をお勧めします。
処理の簡単さを優先するならpandasをお勧めします。覚えるべきことは多いですが将来役に立つことも多いです。

投稿2021/01/29 13:16

ppaul

総合スコア24670

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

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

kome1125

2021/01/29 14:20

やはりcsvファイルの性質上、私が望んでいるような処理をストレートに行うことは難しいのですね。
guest

0

Pandas使うのが楽じゃないかな。

Python

1import pandas as pd 2import io 3 4txt = """ 5Name,Count 6Apple,1 7Banana,1 8Peach,1 9Orange,1 10""" 11 12df = pd.read_csv(io.StringIO(txt), index_col='Name') 13# df = pd.read_csv("fruits.csv", index_col='Name') 14print(df) 15 16while True: 17 fruit_name = input("好きな果物は? ") 18 if len(fruit_name) == 0: 19 break 20 if fruit_name in df.index.values: 21 df.loc[fruit_name] += 1 22 else: 23 df.loc[fruit_name] = 1 24 print(df) 25 26df.to_csv("fruits.csv")

投稿2021/01/28 16:57

Daregada

総合スコア11990

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

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

kome1125

2021/01/29 14:18

pandasについて調べてみようと思います、ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問