Python ValueError:无法将字符串转换为浮点:从DictReader读取
我正在尝试使用.DictReader从csv文件中读取内容,并根据从标头(键)中读取的内容的值,我希望使用.DictWriter写入新的csv文件。我收到一个错误,上面写着ValueError:无法将字符串转换为浮点 据我所知,DictReader将获得一个字符串列表,而不仅仅是字符串,因此它将无法直接转换为csv.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')
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…在这种情况下,我修改了代码,以另一种可能更好的方式解决它。如果仍然没有,请发布您的输入文件,并在您的问题中添加指向该文件的链接。