回答編集履歴

3

追記

2017/09/02 16:49

投稿

LouiS0616
LouiS0616

スコア35660

test CHANGED
@@ -166,6 +166,26 @@
166
166
 
167
167
 
168
168
 
169
+ ```Python
170
+
171
+ >>> float(' 3.4 ')
172
+
173
+ 3.4
174
+
175
+ >>> float('')
176
+
177
+ Traceback (most recent call last):
178
+
179
+ File "<stdin>", line 1, in <module>
180
+
181
+ ValueError: could not convert string to float:
182
+
183
+ >>>
184
+
185
+ ```
186
+
187
+
188
+
169
189
  ---
170
190
 
171
191
  そうなると問題は、**末尾のコンマの取り除き方**に切り替わります。

2

修正

2017/09/02 16:49

投稿

LouiS0616
LouiS0616

スコア35660

test CHANGED
@@ -148,7 +148,7 @@
148
148
 
149
149
 
150
150
 
151
- 結論から言うと、**末尾のコンマを除去していないのが原因です。**
151
+ 結論言うと、**末尾のコンマを除去していないのが原因です。**
152
152
 
153
153
  ```Python
154
154
 

1

追記

2017/09/02 16:48

投稿

LouiS0616
LouiS0616

スコア35660

test CHANGED
@@ -43,3 +43,193 @@
43
43
 
44
44
 
45
45
  と**『出来ない』**とただ主張されても、解決策が見えないです。
46
+
47
+
48
+
49
+ 追記
50
+
51
+ ---
52
+
53
+ > 1行ならばできるようになったのですが複数行で行おうとするとエラーがでます。
54
+
55
+
56
+
57
+ 色々と情報が不足していますが、問題点に心当たりがあります。
58
+
59
+ 質問者様のプログラムは、このような構造になっていますね。(ところどころ端折ってます)
60
+
61
+ > ```Python
62
+
63
+ > with open(filename) as f:
64
+
65
+ > for row in f:
66
+
67
+ > columns = row.rstrip().split(',')
68
+
69
+ > for column in columns:
70
+
71
+ > n=float(column)
72
+
73
+ > ```
74
+
75
+
76
+
77
+ 期待している通りに値が取り扱われているか、次のように確かめることが出来ます。
78
+
79
+ ```Python
80
+
81
+ with open(filename) as f:
82
+
83
+ for row in f:
84
+
85
+ print('row', row)
86
+
87
+ columns = row.rstrip().split(',')
88
+
89
+ print('columns', columns)
90
+
91
+ for column in columns:
92
+
93
+ print(column)
94
+
95
+ n=float(column)
96
+
97
+ ```
98
+
99
+
100
+
101
+ ところどころにprint関数を挟んだだけです。俗にprintデバッグと呼びます。
102
+
103
+ 非常にシンプルな手法ですが、強力な方法です。
104
+
105
+
106
+
107
+ さて、ひょっとしてcsvファイルは、このような形式ではないですか?
108
+
109
+ ```
110
+
111
+ 1.3, 5.3, 5.2,
112
+
113
+ 3.4, 3.2, 4.1
114
+
115
+ ```
116
+
117
+
118
+
119
+ これを読み込んで先ほどのprintデバッグをすると、次のように出力されます。
120
+
121
+ ```
122
+
123
+ row 1.3, 5.3, 5.2,
124
+
125
+ columns ['1.3', ' 5.3', ' 5.2', '']
126
+
127
+ 1.3
128
+
129
+ 5.3
130
+
131
+ 5.2
132
+
133
+
134
+
135
+ Traceback (most recent call last):
136
+
137
+ File "testest.py", line 8, in <module>
138
+
139
+ n = float(column)
140
+
141
+ ValueError: could not convert string to float:
142
+
143
+ ```
144
+
145
+
146
+
147
+ `columns`に変なのがまじっていませんか...?
148
+
149
+
150
+
151
+ 結論から言うと、**末尾のコンマを除去していないのが原因です。**
152
+
153
+ ```Python
154
+
155
+ >>> 'a, b, c, d'.split(',')
156
+
157
+ ['a', ' b', ' c', ' d']
158
+
159
+ >>> 'a, b, c, d,'.split(',')
160
+
161
+ ['a', ' b', ' c', ' d', '']
162
+
163
+ >>>
164
+
165
+ ```
166
+
167
+
168
+
169
+ ---
170
+
171
+ そうなると問題は、**末尾のコンマの取り除き方**に切り替わります。
172
+
173
+ 一般的には、文字列の右端を切り取るのにはスライスを用いることが出来ます。
174
+
175
+ ```
176
+
177
+ >>> 'a, b, c, d,'[:-1]
178
+
179
+ 'a, b, c, d'
180
+
181
+ >>>
182
+
183
+ ```
184
+
185
+
186
+
187
+ しかし、この方法は最終行の最後の文字も削ってしまい、ここでは不適です。
188
+
189
+ `rstrip`でコンマを除去すると良いでしょう。
190
+
191
+ ```Python
192
+
193
+ >>> 'a, b, c, d,'.rstrip(',')
194
+
195
+ 'a, b, c, d'
196
+
197
+ >>> 'a, b, c, d'.rstrip(',')
198
+
199
+ 'a, b, c, d'
200
+
201
+ >>>
202
+
203
+ ```
204
+
205
+
206
+
207
+ これなら上手くいきそうですね。
208
+
209
+
210
+
211
+ ---
212
+
213
+ コードに関しましても、マークダウン表記をしていただければ、簡単にレビューします。
214
+
215
+ ただ一つだけ先に言っておくと、**インスタンスにlistと名付けるのは絶対に避けてください。**
216
+
217
+ ```Python
218
+
219
+ >>> list('abc')
220
+
221
+ ['a', 'b', 'c']
222
+
223
+ >>> list = []
224
+
225
+ >>> list('abc')
226
+
227
+ Traceback (most recent call last):
228
+
229
+ File "<stdin>", line 1, in <module>
230
+
231
+ TypeError: 'list' object is not callable
232
+
233
+ >>>
234
+
235
+ ```