从php文件加载数据到python中

9 浏览
0 Comments

从php文件加载数据到python中

我有一个巨大的php文件,其中包含一些数组。\n


\n实际的文件包含64个quadrature_weights,数组中的数字的实际小数位数约为200(为了方便阅读,我在这里减少了数字的数量)。\n我想将这个文件加载到Python中,并确定要保留多少位小数。假设我决定保留4位小数,输出应该是一个类似下面的字典(或其他容器):\n

quadrature_weights = {
    2: [1.0000, 
        1.0000],
    3: [0.8888,
        0.5555,
        0.5555],
    4: [0.6521,
        0.6521,
        0.3478,
        0.3478]
 }

\n我对php不熟悉,坦率地说,我不知道该怎么做。我猜可能可以逐行读取每一行,然后手动进行某种形式的“解码”,但我真的希望避免这样做。

0
0 Comments

问题的出现原因是,如果PHP文件中的小数位数在200个左右,那么PHP将对其进行截断,如果让PHP解析这些数组并将其输出为JSON,那么完全有可能无法得到相同的数字。

解决方法是,使用Python逐行读取文件并使用正则表达式进行解析。可以按照以下代码进行操作:

import re
quadrature_weights = {}
max_decimals = 6
with open("/path/to/file.php") as phpfile:
    key = None
    for line in phpfile:
        match_key = re.search("\[(\d+)\]", line)
        if match_key:
            key = match_key.group(1)
            quadrature_weights[key] = []
            continue
        match_value = re.search("([\d.]+)", line)
        if match_value:
            quadrature_weights[key].append(
                round(float(match_value.group(1)), max_decimals)
            )
print(quadrature_weights)

使用类似您的输入文件,此代码的输出将如下所示(为了可读性已缩进):

{
    '2': [1.0, 1.0],
    '3': [0.888889, 0.555556, 0.555556],
    '4': [0.652145, 0.652145, 0.347855, 0.347855]
}

如果希望始终保留正确的小数位数,即使数字是"1.0000000000000",则应将数字视为字符串处理:

match_value = re.search("([\d.]+)", line)
if match_value:
    value = match_value.group(1)
    period = value.index('.')
    max_length = period + 1 + max_decimals
    quadrature_weights[key].append(value[0:max_length])

通过此更改,字典将如下所示(为了可读性已缩进):

{
    '2': ['1.000000', '1.000000'],
    '3': ['0.888888', '0.555555', '0.555555'],
    '4': ['0.652145', '0.652145', '0.347854', '0.347854']
}

然后,当您需要实际使用这些数值进行计算时,可以将其转换为浮点数。

如果代码一开始无法正常工作,可以稍微调整一下,并尝试使其正常工作。

0