如何在带有字符串的文本文件中添加数字

时间:2019-02-05 20:21:00

标签: python-3.x string text sum

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: 

数据集:[1]:https://i.stack.imgur.com/xON30.png

1 个答案:

答案 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