提问人:Kat Neumann 提问时间:7/18/2023 更新时间:7/18/2023 访问量:43
从字符串中获取小数强制转换
Getting a decimal cast out of a string
问:
我正在尝试将 txt 文件读入字典列表,但由于某些条目是强制转换的小数(这是我无法更改的函数的输出),因此当我从 txt 文件中读出它们时,它们是双字符串的。
这是我用来创建我在极客上找到的极客列表的代码:
damages = []
def parse(d):
dictionary = dict()
# Removes curly braces and splits the pairs into a list
pairs = d.strip('{}').split(', ')
for i in pairs:
pair = i.split(': ')
# Other symbols from the key-value pair should be stripped.
dictionary[pair[0].strip('\'\'\"\"\"\"')] = pair[1].strip('\'\'\"\"\'\'')
return dictionary
try:
geeky_file = open('TowerA/0-deg-DamagesStates.txt', 'rt')
lines = geeky_file.read().split('\n')
for l in lines:
if l != '':
dictionary = parse(l)
damages.append(dictionary)
#print(dictionary)
geeky_file.close()
except:
print("Something unexpected occurred!")
列表的一行是:{'DS_0': "Decimal('0.7180868594')", 'DS_1': '0', 'DS_2': '0', 'DS_3': "Decimal('0.2819131406')"}
但是,为了运行下一个分析方法,必须不带外部字符串引号。"Decimal('0.7180868594')"
Decimal('0.7180868594')
我尝试在 def 解析中去除更多引号,但这无济于事。
任何想法都非常感谢!
答:
0赞
SidMcHeath
7/18/2023
#1
您可以手动拼接字符串,如下所示:
if value.startswith("Decimal('") and value.endswith("')"):
value = Decimal(value[9:-2])
在。这是一个非常低效的解决方案,但希望它足以满足您的目的。parse
0赞
user19077881
7/18/2023
#2
我猜您的“下一个分析方法”涉及使用十进制库模块中的十进制;这将一个数字作为字符串。如果是这样,那么也许这很有用:
您可以对整个字符串使用该函数:eval
n = eval("Decimal('0.7180868594')")
但是,eval 具有特定的安全缺陷,您可以查找这些缺陷。
最好提取字符串并使用它:
from decimal import Decimal
import re
s = "Decimal('0.7180868594')"
m = re.search(r"(\d+\.\d+)", s).group(1)
n = Decimal(m)
评论
0赞
Kat Neumann
7/18/2023
谢谢!我使用第二种提取方法来更新我所拥有的列表中的所有字符串。Eval 还使用了下一种分析方法——我正在用 IN-CORE 进行灾难建模,它有自己的 Python 库用于分析,所以所有内容都必须采用正确的格式才能输入到方法的定义中。
评论
"Decimal('0.7180868594')"
是一个字符串。在下一个分析方法中,您打算用它做什么?strip
.strip('\'"')