インポートしようとしているcsvダンプがあり、その中のメトリックの分析を実行し、特定のメトリックを選択して確認します。一部のセルは文字列で、一部は数値です。ただし、csv.readerで数値を正しく処理できません。スニペット:
with open('t0.csv', 'rU') as file:
reader = csv.reader(file, delimiter=",", quotechar='|')
reader.next() # Burn header row
for row in reader:
if row[0] != "": # Burn footer row
t0_company.extend([unicode(row[3], 'utf-8')])
t0_revenue.extend([row[9]])
t0_clicks.extend([row[10]])
t0_pageviews.extend([row[11]])
t0_avg_cpc.extend([row[13]])
t0_monthly_budget.extend([row[16]])
t1のメトリックに同じ形式の別のファイルを入力しました。次に、次のように、metric_dict = {'company':'metric'}の形式でメトリックごとに2つのdictを作成します(1つはt0に、もう1つはt1に)。
metric = dict(zip(company, metric))
ただし、これらのメトリックで単純な計算を実行することには問題があります。
percent_change = float(t1_metric_dict[company]) / float(t0_metric_dict[company]) - 1
次のようなエラーを返します。
Traceback (most recent call last):
File "report.py", line 104, in <module>
start_revenue_dict[company], end_revenue_dict[company], float(end_revenue_dict[company]) / float(start_revenue_dict[company]) - 1,
ValueError: could not convert string to float: "6.18"
毎回文句を言うのに同じ番号を選ぶようです。
3番目の要素としてプレースホルダー文字列を入れ替えると、すべてが正常に機能するため、分割でエラーが発生することはかなり確実です。
また、quoting = csv.QUOTE_NONNUMERICを使用して、最初のスニペットの2行目を次のように変更してみました。
reader = csv.reader(file, delimiter=",", quotechar='|', quoting=csv.QUOTE_NONNUMERIC)
これは私にこのエラーをもたらします:
Traceback (most recent call last):
File "report.py", line 30, in <module>
reader.next()
ValueError: could not convert string to float: "Type"
重要ではないと思いますが、csvに奇妙なセルタイプ(すべてがテキスト)が含まれていないことを確認してみました。これについて助けていただければ幸いです。
- - - アップデート - - -
入力ファイルの列の1つに電子メールアドレスが含まれています。実験として、入力ドキュメントからすべての@を削除しました。これにより、表示されるエラーメッセージが変更されました。
Traceback (most recent call last):
File "report.py", line 129, in <module>
unicode_row = [str(item).encode('utf8') for item in utf8_row]
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 2: ordinal not in range(128)
参照しているコードは、csvoutセクションです。
writer = csv.writer(open('output.csv', 'wb'), delimiter=",", quotechar='|')
for utf8_row in report:
unicode_row = [str(item).encode('utf8') for item in utf8_row]
writer.writerow(unicode_row)
-----アップデート#2-----
要求に応じて、問題を引き起こしている完全なスニペットは次のとおりです。
for company in companies_in_both:
report.append([company,
start_revenue_dict[company], end_revenue_dict[company], float(end_revenue_dict[company]) / float(start_revenue_dict[company]) - 1,
start_clicks_dict[company], end_clicks_dict[company], float(end_clicks_dict[company]) / float(start_clicks_dict[company]) - 1,
start_pageviews_dict[company], end_pageviews_dict[company], float(end_pageviews_dict[company]) / float(start_pageviews_dict[company]) - 1,
start_avg_cpc_dict[company], end_avg_cpc_dict[company], float(end_avg_cpc_dict[company]) / float(start_avg_cpc_dict[company]) - 1,
start_monthly_budget_dict[company], end_monthly_budget_dict[company], float(end_monthly_budget_dict[company]) / float(start_monthly_budget_dict[company]) - 1])