【问题标题】:ValueError: Could not convert string to float: Reading from DictReaderValueError:无法将字符串转换为浮点数:从 DictReader 读取
【发布时间】:2019-10-19 07:38:08
【问题描述】:

我正在尝试使用 .DictReader 从 csv 文件中读取数据,并且根据我从标题(键)中读取的值,我想使用 .DictWriter 写入新的 csv 文件。我收到一条错误消息,提示 ValueError: could not convert string to float。

据我了解,DictReader 将获得一个字符串列表,而不仅仅是字符串,因此它无法直接转换为 csv.DictReader 正在读取的内容。所以我试图通过列表迭代铸造。它仍然给我一些错误。

第一个代码:

import csv

with open('report.csv', 'r') as openfile:               #open report
    csv_reader = csv.DictReader(openfile, delimiter='\t')

#writing to a new file start
    #sets up the output file output.csv
    with open('output.csv', 'w') as new_file:

        #hardcoding the filename
        fieldnames = csv_reader.fieldnames
        fieldnames = ['header1', 'header2', 'header3']

        #setting the parameters for the output file
        csv_writer = csv.DictWriter(new_file, fieldnames=fieldnames, delimiter='\t', extrasaction='ignore')
        csv_writer.writeheader()

        for line in csv_reader:           #checking every line we are reading
                headerval= line['header2']
                if float(header2val) >= 200:   #check condition 
                        csv_writer.writerow(line)        #writes if true

然后我尝试迭代演员表(不确定这是否正确)


import csv

with open('report.csv', 'r') as openfile:               #open report
    csv_reader = csv.DictReader(openfile, delimiter='\t')

#writing to a new file start
    #sets up the output file output.csv
    with open('output.csv', 'w') as new_file:

        #hardcoding the filename
        fieldnames = csv_reader.fieldnames
        fieldnames = ['header1', 'header2', 'header2']

        #setting the parameters for the output file
        csv_writer = csv.DictWriter(new_file, fieldnames=fieldnames, delimiter='\t', extrasaction='ignore')
        csv_writer.writeheader()

          for line in csv_reader:       #checking every line we are reading
                  for checkval in line['header2']: #iterate the casting
                          headerval= float(checkval)
                          if headerval >= 200:     #check condition
                                 csv_writer.writerow(line) #writes if  true

第一个代码错误消息:“TypeError float() 参数必须是字符串或数字” 预期的输出结果是正确的。打印到 output.csv 的标头和值满足代码 1 中的条件。

第二个代码错误消息:“ValueError:无法将字符串转换为浮点数” 在代码 2 中,仅打印标题。

编辑:report.csv

    header1 header2 header3 header4 header5 
1   30.35   true    true    false
2   20.35   false   true    false
3   50.35   true    true    false
4   10.35   true    true    false
5   20.35   true    true    false
6   70.35   false   true    false
7   85.26   false   true    false
8   83.39   true    true    false
9   172.11  true    true    false
10  184.99  false   true    false
11  146.11  true    true    false
12  230.28  false   true    false
13  124.42  false   true    false
14  416.15  true    true    false
15  257.27  false   true    false
16  263.39  true    true    false
17  295.0   true    true    false
18  175.35  true    true    false
19  275.62  true    true    false
20  189.08  true    true    false
21  163.05  true    true    false
22  166.66  false   true    false
23  186.9   false   true    false
24  181.42  false   true    false
25  181.18  false   true    false
26  184.12  false   true    false
27  177.27  false   true    false
28  238.61  true    true    false
29  163.88  true    true    false
30  204.12  false   false   false
31  215.22  true    true    false
32  166.41  true    true    false
33  143.49  true    true    false
34  181.31  true    true    false
35  431.25  false   false   false
36  245.3   false   false   false
37  245.89  false   false   false
38  251.72  true    true    false
39  161.89  false   false   false
40  210.83  true    true    false
41  188.25  false   false   false
42  186.48  true    true    false
43  205.49  false   false   false
44  184.07  true    true    false
45  144.83  true    true    false
46  167.21  true    true    false
47  181.11  false   false   false
48  183.73  true    true    true
49  175.57  true    true    false

【问题讨论】:

  • 在将其转换为浮点数之前尝试打印header2val。看看是不是真的数不是
  • 这两个错误发生在哪几行?
  • @martineau 第一个代码错误消息:“TypeError float() 参数必须是字符串或数字”在第 28 行,即 --> if float(header2val) >= 200: #check condition第二个代码错误消息:第 29 行中的“ValueError: could not convert string to float” --> headerval= float(checkval)
  • @snakecharmerb 我尝试在转换为浮动之前和之后打印...。在转换之前我得到'30.35',在没有单个刻度的情况下我只得到 30.35
  • Grace:好的,这有帮助,但我无法用第一个代码重现问题。您能否将 report.csv 文件开头的几行复制并粘贴到您的问题中?顺便说一句,fieldnames = ['header1', 'header2', 'header2'] 这一行不应该是fieldnames = ['header1', 'header2', 'header3']吗?

标签: python csv parsing text-parsing string-parsing


【解决方案1】:

我认为report.csv 文件的标头可能格式不正确,这会混淆使用DictReader 读取它 - 所以这是一种解决方法,至少可以让问题第一部分中的代码正常工作.它对读者应该使用的字段名进行硬编码,并忽略标题行。

import csv

input_filename = 'report.csv'
output_filename = 'output.csv'

fieldnames = ['header1', 'header2', 'header3']  # Hardcode the fieldnames.

with open(input_filename, 'r', newline ='') as openfile:
    csv_reader = csv.DictReader(openfile, fieldnames=fieldnames, delimiter='\t')
    next(csv_reader)  # Skip badly formatted header.

    with open(output_filename, 'w', newline ='') as new_file:
        csv_writer = csv.DictWriter(new_file, fieldnames=fieldnames, delimiter='\t',
                                    extrasaction='ignore')
        csv_writer.writeheader()

        for line in csv_reader:
            header2val= line['header2']  # Get second column.
            if float(header2val) >= 200:  # Check value.
                csv_writer.writerow(line)

【讨论】:

  • 谢谢!我尝试这样做,它给了我一个错误 IndexError: list index out of range in the line header2val= line[1] # get second column.
  • Grace:嗯...在那种情况下,我已经修改了代码,以另一种可能更好的方式解决它。如果仍然没有,请将您的输入文件发布到 pastebin 并添加指向您问题的链接。
猜你喜欢
  • 1970-01-01
  • 2019-03-23
  • 2018-06-13
  • 2013-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-04
相关资源
最近更新 更多