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

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

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

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

Python

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

Q&A

1回答

1511閲覧

csvファイルの指定した行へ数値を書き込みたい

hoku_mhib

総合スコア1

CSV

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

Python

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

0グッド

0クリップ

投稿2020/06/26 07:31

編集2020/06/26 08:23

前提・実現したいこと

既存のcsvファイルから4つの数値を取得し、それらを演算した結果をある条件分岐によって2行目か3行目に書き込みたいです。
実行するたびに更新されていくようにしたいです。

発生している問題・エラーメッセージ

パスについては問題無いです。

IndexError: list index out of range

該当のソースコード

Python

1import os 2import glob 3import sys 4import pathlib 5import csv 6 7from PIL import Image, ImageFilter 8from programs.utils import checker 9 10def _load_coord(path_datafolder): 11 """腫瘍の位置座標を取り出す 12 13 Args: 14 path_datafolder (pathlib.Path): データ1つのフォルダパス 15 16 Returns: 17 list: 座標. [(x1,y1, x2,y2), (...), ...] 18 座標が複数個あれば複数個取り出す 19 """ 20 path_datafolder = list(path_datafolder.glob('*roi.csv'))[0] 21 with path_datafolder.open('r', encoding='utf-8') as f: 22 reader = csv.reader(f) 23 return [ 24 tuple(map(int, it)) 25 for it in reader 26 ] 27 28def newROI_save(path_load, crop_range, size, target): 29 """ 30 調整したROIの座標をCSVファイルに保存する 31 32 Args: 33 path_load:元画像のある場所へのパス 34 target:test, train, validationのいずれか 35 """ 36 if not path_load.exists(): 37 raise FileNotFoundError(path_load) 38 39 path_img_list = path_load / 'list/dataset/{}.txt'.format(target) 40 if not path_img_list.exists(): 41 raise FileNotFoundError(path_img_list) 42 43 # CSVファイル1行目から元の座標を読み取り 44 with path_img_list.open('r', encoding='utf-8') as f: 45 reader = csv.reader(f) 46 for line in reader: 47 path_datafolder = path_load / line[0] # amed_abdomen/hcc/**を読み込む 48 coord = _load_coord(path_datafolder) 49 50 new_coord = [coord[0][0] + crop_range[0], coord[0][1] + crop_range[1], 51 coord[0][2] - crop_range[2], coord[0][3] - crop_range[3]] 52 53 # (64,64):2行目,(256,256):3行目 に更新した座標を書き込み 54 if size == (64,64): 55 path_savefolder = list(path_dactafolder.glob('*roi.csv'))[1] 56 with path_savefolder.open('w', encoding='utf-8') as f: 57 writer = csv.writer(f) 58 writer.writerows(new_coord) 59 elif size == (256,256): 60 path_savefolder = list(path_datafolder.glob('*roi.csv'))[2] 61 with path_savefolder.open('w', encoding='utf-8') as f: 62 writer = csv.writer(f) 63 writer.writerows(new_coord) 64 65def bring_expansion64(path_load, load_dir, save_path, save_folder, size, target): 66 """ 67 指定されたディレクトリ内のデータセットの拡大 68 69 Args: 70 path_load:元画像のある場所へのパス 71 load_dir:作成済データセットのあるディレクトリ名 72 save_path:調整後の画像を保存する場所へのパス 73 save_folder:保存するためのフォルダ名 74 size:リサイズ後のサイズ 75 """ 76 77 path_load = pathlib.Path(path_load) 78 save_path = pathlib.Path(save_path) 79 load_dir = pathlib.Path(load_dir) 80 save_folder = pathlib.Path(save_folder) 81 crop_range = 10, 10, 54, 54 82 83 path_save = save_path/save_folder 84 85 if not load_dir.exists(): 86 raise FileNotFoundError(load_dir) 87 88 try: 89 path_save.mkdir(parents=True) 90 except FileExistsError as e: 91 if not checker.overwrite(e): 92 sys.exit("stop running") 93 94 types = ['*.png', '*.jpg',] 95 img_list = [] 96 name_list = [] 97 ext_list = [] 98 99 for t in types: 100 img_list.extend(glob.glob(os.path.join(load_dir, t))) 101 102 for i in img_list: 103 file = os.path.basename(i) # 拡張子ありファイル名を取得 104 name, ext = os.path.splitext(file) # 拡張子なしファイル名と拡張子を取得 105 name_list.append(name) # 拡張子なしファイル名をリスト化 106 ext_list.append(ext) # 拡張子をリスト化 107 img = Image.open(i) 108 109 output_path = os.path.join(path_save, name + ext) 110 111 img_ = img.crop(crop_range) #切り抜き 112 113 image = img_.resize(size) 114 image.save(output_path) 115 116 newROI_save(path_load, list(crop_range), size, target) 117 print('save new ROI of 64,64 images coord.') 118 return 119 120def bring_expansion256(path_load, load_dir, save_path, save_folder, size, target): 121 """ 122 指定されたディレクトリ内のデータセットの拡大 123 124 Args: 125 path_load:元画像のある場所へのパス 126 load_dir:作成済データセットのあるディレクトリ名 127 save_path:調整後の画像を保存する場所へのパス 128 save_folder:保存するためのフォルダ名 129 size:リサイズ後のサイズ 130     """ 131 132 path_load = pathlib.Path(path_load) 133 save_path = pathlib.Path(save_path) 134 load_dir = pathlib.Path(load_dir) 135 save_folder = pathlib.Path(save_folder) 136 crop_range = 38, 38, 218, 218 137 138 path_save = save_path/save_folder 139 140 if not load_dir.exists(): 141 raise FileNotFoundError(load_dir) 142 143 try: 144 path_save.mkdir(parents=True) 145 except FileExistsError as e: 146 if not checker.overwrite(e): 147 sys.exit("stop running") 148 149 types = ['*.png', '*.jpg',] 150 img_list = [] 151 name_list = [] 152 ext_list = [] 153 154 for t in types: 155 img_list.extend(glob.glob(os.path.join(load_dir, t))) 156 157 for i in img_list: 158 file = os.path.basename(i) # 拡張子ありファイル名を取得 159 name, ext = os.path.splitext(file) # 拡張子なしファイル名と拡張子を取得 160 name_list.append(name) # 拡張子なしファイル名をリスト化 161 ext_list.append(ext) # 拡張子をリスト化 162 img = Image.open(i) 163 164 output_path = os.path.join(path_save, name + ext) 165 166 img_ = img.crop(crop_range) #切り抜き 167 168 image = img_.resize(size) 169 image.save(output_path) 170 171 newROI_save(path_load, list(crop_range), size, target) 172 return 173 174if __name__ == '__main__': 175 176 bring_expansion64('gpu/mkdata', './data/abdomen64/train/tumor', 177 './data/remake/abdomen64/train', 'exp_tumor', (64,64), 'train') 178 179 180 bring_expansion256('gpu/mkdata', './data/abdomen256/train/tumor', 181 './data/remake/abdomen256/train', 'exp_tumor', (256,256), 'train')

試したこと

ネットでpandasについて調べたのですが私の実現したいことが書かれていませんでした。
mode='a'とすると上書きできると思うのですが、末尾へ追記されるだけだと思うのでどうしようか、、という感じです。

if文の箇所を下記のように書き直してみました。しかしまだ上手く動いてくれません。

# (64,64):2行目,(256,256):3行目 に更新した座標を書き込み if size == (64,64): sf = pd.read_csv(path_datafolder.glob('*roi.csv')) sf = sf.drop(1) sf.loc[1] = new_coord elif size == (256,256): sf = pd.read_csv(path_datafolder.glob('*roi.csv')) sf = sf.drop(2) sf.loc[2] = new_coord

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

Python 3.6.9
VSCode

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

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

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

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

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

guest

回答1

0

配列、あるいはリストの範囲を超えてアクセスしたというエラーです
そのエラーが出た場所のリストのサイズをチェックしてみよう

投稿2020/06/26 08:01

y_waiwai

総合スコア87747

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問