Python ValueError:无法将字符串转换为浮点:从DictReader读取

Python ValueError:无法将字符串转换为浮点:从DictReader读取,python,csv,parsing,text-parsing,string-parsing,Python,Csv,Parsing,Text Parsing,String Parsing,我正在尝试使用.DictReader从csv文件中读取内容,并根据从标头(键)中读取的内容的值,我希望使用.DictWriter写入新的csv文件。我收到一个错误,上面写着ValueError:无法将字符串转换为浮点 据我所知,DictReader将获得一个字符串列表,而不仅仅是字符串,因此它将无法直接转换为csv.DictReader正在读取的内容。所以我试着在列表中重复这个角色。它仍然给我一些错误 第一个代码: import csv with open('report.csv', 'r')

我正在尝试使用.DictReader从csv文件中读取内容,并根据从标头(键)中读取的内容的值,我希望使用.DictWriter写入新的csv文件。我收到一个错误,上面写着ValueError:无法将字符串转换为浮点

据我所知,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

然后我尝试迭代该强制转换(不确定这是否正确)


第一条代码错误消息:“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

我认为
report.csv
文件的标题可能格式不正确,这会使使用
读写器读取该文件时出错-因此,这里有一种解决方法,至少可以让问题第一部分的代码正常工作。它硬编码读者应该使用的字段名,并忽略标题行

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)

我认为
report.csv
文件的标题可能格式不正确,这会使使用
读写器读取该文件时出错-因此,这里有一种解决方法,至少可以让问题第一部分的代码正常工作。它硬编码读者应该使用的字段名,并忽略标题行

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)

尝试打印
header2val
,然后再将其转换为float。看看它是否真的是一个数字not发生在哪两行?@martineau第一个代码错误消息:“TypeError float()参数必须是字符串或数字”在第28行,即-->如果float(header2val)>=200:#检查条件第二个代码错误消息:“ValueError:无法将字符串转换为float”在第29行-->headerval=float(checkval)@snakecharmerb中,我尝试在铸造浮动之前和之后打印。。。。在施法之前,我得到了“30.35”,在施法之后,我只得到了30.35,没有一个tickGrace:好的,这很有帮助,但我不能用第一个代码重现这个问题。能否将
report.csv
文件开头的几行复制粘贴到您的问题中?顺便问一下,行
fieldnames=['header1','header2','header2']
不应该是
fieldnames=['header1','header2','header3']
?在将其转换为float之前,请尝试打印
header2val
。看看它是否真的是一个数字not发生在哪两行?@martineau第一个代码错误消息:“TypeError float()参数必须是字符串或数字”在第28行,即-->如果float(header2val)>=200:#检查条件第二个代码错误消息:“ValueError:无法将字符串转换为float”在第29行-->headerval=float(checkval)@snakecharmerb中,我尝试在铸造浮动之前和之后打印。。。。在施法之前,我得到了“30.35”,在施法之后,我只得到了30.35,没有一个tickGrace:好的,这很有帮助,但我不能用第一个代码重现这个问题。能否将
report.csv
文件开头的几行复制粘贴到您的问题中?顺便问一下,
fieldnames=['header1'、'header2'、'header2']
行不应该是
fieldnames=['header1'、'header2'、'header3']
?谢谢!我试着这么做,但它给了我一个错误索引器:行标题2val=line[1]中的列表索引超出范围#get second column.Grace:Hmm…在这种情况下,我修改了代码,以另一种可能更好的方式解决它。如果仍然没有,请在上发布您的输入文件,并在您的问题中添加链接。谢谢!我试着这么做,但它给了我一个错误索引器:行标题2val=line[1]中的列表索引超出范围#get second column.Grace:Hmm…在这种情况下,我修改了代码,以另一种可能更好的方式解决它。如果仍然没有,请发布您的输入文件,并在您的问题中添加指向该文件的链接。