将文件中的行拆分为字符串和十六进制,并对十六进制值执行操作

2024-10-02 04:31:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个大文件,其中有几行如下所示,我只想读入那些有_INIT模式的行,然后从名称中去掉_INIT,只将OSD_MODE_15_H部分保存在一个变量中。然后我需要读取相应的十六进制值,在本例中是8'h00,从中去掉8'h,用一个0x替换它,并保存在一个变量中。 我一直在尝试去掉初始化、空格和=,代码变得非常混乱。在

localparam OSD_MODE_15_H_ADDR = 16'h038d;
localparam OSD_MODE_15_H_INIT = 8'h00

你能推荐一种清洁的清洁方法吗?在

谢谢!在


Tags: 文件方法代码名称initmode模式addr
3条回答

您可以使用正则表达式和re.findall()函数。例如,要生成包含所需数据的元组列表,请尝试:

import re
lines = open("your_file").read()
regex = "([\w]+?)_INIT\s*=\s*\d+'h([\da-fA-F]*)"
res = [(x[0], "0x"+x[1]) for x in re.findall(regex, lines)]
print res

正则表达式对于您的输入示例来说非常特殊。如果文件中的其他行稍有不同,您可能需要稍微更改一下。在

下面的解决方案使用正则表达式(编译以加快搜索速度)来匹配相关行并提取所需的信息。表达式使用命名组“id”和“hexValue”来标识要从匹配行提取的数据。在

import re

expression = "(?P<id>\w+?)_INIT\s*?=.*?'h(?P<hexValue>[0-9a-fA-F]*)"
regex = re.compile(expression)

def getIdAndValueFromInitLine(line):
  mm = regex.search(line)
  if mm == None:
    return None # Not the ..._INIT parameter or line was empty or other mismatch happened
  else:
    return (mm.groupdict()["id"], "0x" + mm.groupdict()["hexValue"])

编辑:如果我正确地理解了下一个任务,那么您需要找到那些id匹配的INIT和ADDR行的hexvalue,并为ADDR hexvalue创建一个字典。在

^{pr2}$

即使这不是您实际需要的,拥有init和addr字典可能会帮助您更容易地实现目标。如果有多个具有相同ID和不同hexvalue的INIT(或ADDR)行,那么上面的dict方法将无法直接工作。在

尝试这样的方法-不确定您的所有要求是什么,但这会让您接近:

with open(someFile, 'r') as infile:
    for line in infile:
        if '_INIT' in line:
            apostropheIndex = line.find("'h")
            clean_hex = '0x' + line[apostropheIndex + 2:]

在“16'h038d;”的情况下,clean_hex将是“0x038d;”(需要以某种方式删除“;”),如果是“8'h00”,clean_hex将是“0x00”

编辑:如果你想防止像“;”这样的字符,你可以这样做并测试一个字符是否是字母数字:

^{pr2}$

相关问题 更多 >

    热门问题