【问题标题】:How to add numbers in Text file with Strings [duplicate]如何使用字符串在文本文件中添加数字[重复]
【发布时间】:2019-02-05 20:20:59
【问题描述】:
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

【问题讨论】:

  • 发布一个示例数据集。我确信这是一个基本的转换问题,但如果您提供与示例一起使用的数据集,它将有助于编写一个好的答案。
  • @Dave 为你添加了 txt 文件的图片
  • 您没有提供足够的错误输出来真正帮助您。请将您的原始 csv 或至少一部分粘贴到您问题的代码块中。此外,请添加完整的错误输出,而不是其编辑版本。完整的错误输出将包括 Traceback、行号、命令,有时还包括导致错误的确切数据。所有这些都是相关的。
  • 欢迎来到 Stack Overflow!不要发布重复的问题。

标签: python-3.x string text sum


【解决方案1】:

TLDR:您将空格分隔的文本视为 csv 模块无法正确解析的 csv。

在我为您解决此问题时,您尚未提供原始 csv 数据,因此对于此问题,我假设您的 csv 文件包含以下数据,基于您对 txt 文件的屏幕截图。

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

【讨论】:

  • 感谢戴夫的洞察力!我现在不确定问题所在,因为我已经替换了代码,但仍然出现错误。将 data = [] 移到 with 语句和循环上方后,我仍然得到与 data.extend(rowdata) 行相关的“值错误:无法将字符串转换为浮点数”......异常值错误语句是否有效?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-23
  • 1970-01-01
相关资源
最近更新 更多