![](/img/trans.png)
[英]Reading csv file to python ValueError: could not convert string to float
[英]ValueError: Could not convert string to float: Reading from DictReader
我正在嘗試使用.DictReader從csv文件讀取,並基於從標題(鍵)讀取的值,我想使用.DictWriter寫入新的csv文件。 我收到一個錯誤,提示ValueError:無法將字符串轉換為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
我認為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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.