编辑:更新,所以我按照@Alex Thornton的建议运行了这个。
这是我的输出:
'100.00"\r'
Traceback (most recent call last):
File "budget.py", line 48, in <module>
Main()
File "budget.py", line 44, in Main
budget = readBudget("budget.txt")
File "budget.py", line 21, in readBudget
p_value = float(maxamount)
ValueError: invalid literal for float(): 100.00"
在Windows下,我只是得到了数字列表,其中有qutations和\ r被剥离了。
现在,我对Windows和Linux处理文本文件的方式不太了解,但是由于Windows和Linux处理return / enter键的方式不是这样吗?
所以我有这段代码:
def readBudget(budgetFile):
# Read the file into list lines
f = open(budgetFile)
lines = f.readlines()
f.close()
budget = []
# Parse the lines
for i in range(len(lines)):
list = lines[i].split(",")
exptype = list[0].strip('" \n')
if exptype == "Type":
continue
maxamount = list[1].strip('$" \n')
entry = {'exptype':exptype, 'maxamnt':float(maxamount)}
budget.append(entry)
#print(budget)
return budget
def printBudget(budget):
print()
print("================= BUDGET ==================")
print("Type".ljust(12), "Max Amount".ljust(12))
total = 0
for b in budget:
print(b['exptype'].ljust(12), str("$%0.2f" %b['maxamnt']).ljust(50))
total = total + b['maxamnt']
print("Total: ", "$%0.2f" % total)
def Main():
budget = readBudget("budget.txt")
printBudget(budget)
if __name__ == '__main__':
Main()
从这个文件读取:
"Type", "MaxAmount"
"SCHOOL","$100.00"
"UTILITIES","$200.00"
"AUTO", "$100.00"
"RENT", "$600.00"
"MEALS", "$300.00"
"RECREATION", "$100.00"
应该提取预算类型(学校,公用事业等)和最高金额。最大金额应该转换为浮点数。但是,当我运行程序时,我收到此错误。
Traceback (most recent call last):
File "budget.py", line 47, in <module>
Main()
File "budget.py", line 43, in Main
budget = readBudget("budget.txt")
File "budget.py", line 22, in readBudget
entry = {'exptype':exptype, 'maxamnt':float(maxamount)}
ValueError: invalid literal for float(): 100.00"
readBudget中的strip函数不应该删除最后一个引号吗?
答案 0 :(得分:1)
当我尝试这个时:
>>> attempt = '"$100.00"'
>>> new = attempt.strip('$" \n')
'100.00'
>>> float(new)
100.00
我得到了人们所期望的 - 所以它必须与我们从文件中看不到的东西有关。从您发布的内容来看,目前尚不清楚您尝试传递给float()
的字符串是否存在微妙的错误(因为它看起来非常合理)。尝试添加调试print
语句:
print(repr(maxamount))
p_value = float(maxamount)
然后,您可以确切地确定传递给float()
的内容。对repr()
的调用将使通常不可见的字符可见。将结果添加到您的问题中,我们将能够进一步发表评论。
修改强>
在这种情况下,请替换:
maxamount = list[1].strip('$" \n')
使用:
maxamount = list[1].strip('$" \n\r')
那应该可以正常工作。
答案 1 :(得分:0)
添加:
maxamount = list[1].strip('$" \n\r')
或者更具体地说,\ r \ n,删除了错误。
答案 2 :(得分:0)
您可以使用正则表达式捕获字符串中的全部或大部分浮点信息。
考虑:
import re
valid='''\
123.45"
123.
123"
.123
123e-16
-123e16
123e45
+123.45'''
invalid='''\
12"34
12f45
e123'''
pat=r'(?:^|\s)([-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?)'
for e in [valid, invalid]:
print
for line in e.splitlines():
m=re.search(pat, line)
if m:
print '"{}" -> {} -> {}'.format(line, m.group(1), float(m.group(1)))
else:
print '"{}" not valid'.format(line)
打印:
"123.45"" -> 123.45 -> 123.45
"123." -> 123 -> 123.0
"123"" -> 123 -> 123.0
".123" -> .123 -> 0.123
"123e-16" -> 123e-16 -> 1.23e-14
"-123e16" -> -123e16 -> -1.23e+18
"123e45" -> 123e45 -> 1.23e+47
"+123.45" -> +123.45 -> 123.45
"12"34" -> 12 -> 12.0
"12f45" -> 12 -> 12.0
"e123" not valid
只需修改正则表达式即可捕获您认为有效的浮点数据点 - 或者无效。