0

インポートしようとしている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])
4

1 に答える 1

1

'|'使用するのに正しいものであると確信していquotecharますか?CSVに関する質問がたくさんあり、すべての例でそれを使用しているようです。おそらく、それが本当に必要なものなのかもしれません。しかし、それは驚くほど珍しいことです。

メッセージは、データにValueError二重引用符が含まれていることを示しています。つまり、Pythonは、と同等のことを行う代わりに、を実行しようとし、窒息します。float("6.18")float('"6.18"')

メモ帳または同等のもので表示した場合に、エラーが発生した場所を囲む、実際のCSVデータの完全な行を数行入力すると役立つ場合があります(機密性がない、法的に機密性が高いなどの場合)。

于 2012-05-25T22:41:54.120 に答える