从字符串中获取小数强制转换

Getting a decimal cast out of a string

提问人:Kat Neumann 提问时间:7/18/2023 更新时间:7/18/2023 访问量:43

问:

我正在尝试将 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 解析中去除更多引号,但这无济于事。

任何想法都非常感谢!

python 列表 字典 转换 txt

评论

1赞 user19077881 7/18/2023
"Decimal('0.7180868594')"是一个字符串。在下一个分析方法中,您打算用它做什么?
0赞 Tim Roberts 7/18/2023
请注意,参数 to 是要删除的字符集。重复事情是没有意义的。 就足够了。strip.strip('\'"')

答:

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 库用于分析,所以所有内容都必须采用正确的格式才能输入到方法的定义中。