我有数百个条目在数百个文件中,看起来像这样(数字不固定):
"DstQuad":[12,-36,27,-36,27,-23,12,-23],"SrcQuad":[493,95,508,95,508,108,493,108]
文件的相关部分看起来像这样,重复了数百次,没有行,只是一个连续的字符串:
{"TexID":0,"DstQuad":[-24,-23,-1,-23,-1,6,-24,6],"SrcQuad":[61,240,84,240,84,269,61,269]},{"TexID":0,"DstQuad":[-11,-73,36,-73,36,-45,-11,-45],"SrcQuad":[87,240,134,240,134,268,87,268]},
我需要能够判断一个数字何时在该结构中,然后取每个数字并将其相乘,同时将不在该结构中的数字单独留下。
试着改编一个我找到的脚本,但它不做任何事情:
def multiply_numbers_in_context(match):
# return "{0}{1}{2}".format(match.group(1), str(float(match.group(2))*4), '"')
return "{0}{1}{2}{3}{4}{5}{6}{7}{8}{9}{10}{11}{12}{13}{14}{15}{16}".format(match.group(1), str(int(match.group(2))*4), ',', str(int(match.group(3))*4), ',', str(int(match.group(4))*4), ',', str(int(match.group(5))*4), ',', str(int(match.group(6))*4), ',', str(int(match.group(7))*4), ',', str(int(match.group(8))*4), ',', str(int(match.group(9))*4), ',', match.group(10), ',', str(int(match.group(11))*4), ',', str(int(match.group(12))*4), ',', str(int(match.group(13))*4), ',', str(int(match.group(14))*4), ',', str(int(match.group(15))*4), ',', str(int(match.group(16))*4), ']')
editor.rereplace(r'("DstQuad":[)(-?d+),(-?d+),(-?d+),(-?d+),(-?d+),(-?d+),(-?d+),(-?d+)(],"SrcQuad":[)(-?d+),(-?d+),(-?d+),(-?d+),(-?d+),(-?d+),(-?d+),(-?d+)(])', multiply_numbers_in_context)
非常感谢你的帮助。
我建议使用json
模块。下面是一个简单的示例,加载一个JSON字符串并使用object_hook
将每个列表元素乘以一个常量值(在本例中为4)。结果string
是一个JSON字符串,然后可以保存到文件中。
我还对您的用例做了一些假设:
- 文件的内容可以表示为一个列表
[]
,其中包含一堆字典{}
与有用的数据 - 所有包含数字的嵌套列表
[]
应该将其所有元素乘以一个常量值(在这种情况下为4)
import json
file_contents = """
[
{"TexID":0,"DstQuad":[-24,-23,-1,-23,-1,6,-24,6],"SrcQuad":[61,240,84,240,84,269,61,269]},
{"TexID":0,"DstQuad":[-11,-73,36,-73,36,-45,-11,-45],"SrcQuad":[87,240,134,240,134,268,87,268]}
]
"""
def hook_fn(value, multiplier=4):
if isinstance(value, list) and value and isinstance(value[0], (int, float)):
return [elem * multiplier for elem in value]
if isinstance(value, dict):
return {k: hook_fn(v) for k, v in value.items()}
return value
string = json.dumps(json.loads(file_contents, object_hook=hook_fn))
print(string)
# [{"TexID": 0, "DstQuad": [-96, -92, -4, -92, -4, 24, -96, 24], "SrcQuad": [244, 960, 336, 960, 336, 1076, 244, 1076]}, {"TexID": 0, "DstQuad": [-44, -292, 144, -292, 144, -180, -44, -180], "SrcQuad": [348, 960, 536, 960, 536, 1072, 348, 1072]}]
从文本文件中读取和写入相反,使用json.load
和json.dump
相反(最后把s
):
with open('input.txt') as in_file:
data = json.load(in_file, object_hook=hook_fn)
with open('output.txt', 'w') as out_file:
json.dump(data, out_file)