我有一个 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])