从php文件加载数据到python中
从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不熟悉,坦率地说,我不知道该怎么做。我猜可能可以逐行读取每一行,然后手动进行某种形式的“解码”,但我真的希望避免这样做。
问题的出现原因是,如果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'] }
然后,当您需要实际使用这些数值进行计算时,可以将其转换为浮点数。
如果代码一开始无法正常工作,可以稍微调整一下,并尝试使其正常工作。