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 为度量输入了另一个相同格式的文件。然后我为每个指标创建两个字典(一个在 t0,另一个在 t1),格式为 metric_dict = {'company': 'metric'},如下所示:

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"

似乎每次都选择同一个号码来抱怨。

我相当肯定错误发生在除法中,因为如果我将占位符字符串作为第三个元素交换,一切正常。

我还尝试使用 quoting=csv.QUOTE_NONNUMERIC,将第一个片段中的第二行更改为

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 没有任何奇怪的单元格类型(一切都是文本),即使我怀疑它是否重要。我将不胜感激任何帮助。

- - - 更新 - - -

我的输入文件中的一列包含电子邮件地址。作为一个实验,我从输入文档中删除了所有@s,这改变了我得到的错误消息:

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)

它引用的代码是 csv out 部分:

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 问题,并且您的所有示例都使用它,所以也许这确实是您想要的。但这是惊人的不寻常。

您的消息告诉您 data 中ValueError有双引号。也就是说,Python 没有做相当于 的 ,而是试图做,而且令人窒息。float("6.18")float('"6.18"')

提供几行完整的实际 CSV 数据可能会有所帮助,包括错误发生的位置,如使用记事本或同等工具查看的那样(前提是它不是机密的、法律敏感的等)。

于 2012-05-25T22:41:54.120 回答