import csv
csv_file = 'Annual Budget.csv'
txt_file = 'annual_budget.txt'
with open(txt_file, 'w') as my_output_file:
with open(csv_file, 'r') as my_input_file:
reader = csv.reader(my_input_file)
for row in reader:
my_output_file.write(" ".join(row)+'\n')
data = []
with open(r'annual_budget.txt', 'r') as f:
reader = csv.reader(f)
header = next(reader)
for line in reader:
rowdata = map(float, line)
data.extend(rowdata)
print(sum(data)/len(data))
试图在带有字符串的文本文件中添加数字,但不断抛出错误。
输出:
data.extend(rowdata)
ValueError: could not convert string to float:
答案 0 :(得分:0)
TLDR:您将空格分隔的文本视为csv,而csv模块无法正确解析。
在我为您解决此问题时,您尚未提供原始的csv数据,因此针对此问题,我基于您的txt文件的屏幕截图假设您的csv文件包含以下数据。
Annual Budget,Q2,Q4
100,450,20
600,765,50
500,380,79
800,480,455
1100,65,4320
现在,关于代码。
您不仅在data = []
的地方定义
未使用,但也会导致将其重置为空
列出您要转换的文件的每个循环。
如果直接在其下添加打印语句,则会得到以下输出:
显示添加的打印语句:
with open(txt_file, 'w') as my_output_file:
with open(csv_file, 'r') as my_input_file:
reader = csv.reader(my_input_file)
for row in reader:
my_output_file.write(" ".join(row)+'\n')
data = []
print(data)
输出:
[]
[]
[]
[]
[]
[]
将data = []
移动到文件顶部可以防止这种情况。
现在使用第二个with
语句并循环执行,您正在将刚刚创建的txt文件视为csv文件。 csv数据以逗号分隔而不是空格分隔。 csv阅读器无法正确解析该行。如果我们添加一个打印循环来检查map函数产生的结果,我们会发现它没有按照您的期望进行操作,将其转换为浮点数列表。
事件代码:
for line in reader:
rowdata = map(float, line)
for element in rowdata:
print(element)
输出:
Traceback (most recent call last):
File "test.py", line 17, in <module>
for element in rowdata:
ValueError: could not convert string to float: '100 450 20'
有多种方法可以解决该问题,但是我认为最好的方法是跳过整个第一个循环,在该循环中将其转换为以空格分隔的文件。这样做,我们仅依靠csv模块来完成它的工作。
示例代码:
import csv
data = []
with open('Annual Budget.csv', 'r') as f:
reader = csv.reader(f) # Gets the reader
header = next(reader) # advance the reader past the header.
for line in reader:
rowdata = map(float, line)
for element in rowdata:
print(element)
输出:
100.0
450.0
20.0
600.0
765.0
50.0
500.0
380.0
79.0
800.0
480.0
455.0
1100.0
65.0
4320.0
现在,我们将添加最后几行代码,并删除测试代码:
import csv
data = []
with open('Annual Budget.csv', 'r') as f:
reader = csv.reader(f) # Gets the reader
header = next(reader) # advance the reader past the header.
for line in reader:
rowdata = map(float, line)
data.extend(rowdata)
print(sum(data)/len(data))
现在输出:
677.6