在读取文件时保存一个扩展到几行的值

2024-09-29 23:26:02 发布

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

我正在写一个小的python脚本,从dir中的几个.c文件中读取参数及其值。参数通常采用以下格式:

uint8 param1 = 1;
sint8 param2 = 2;

然而,有时它们看起来是这样的:

param3 = {
1, 2, 3,
4, 5, 6
};

甚至:

param4 = {
1, 2, 3,
{
4, 5, 6
},
};

正如您在涉及param3 and param4的情况中所怀疑的,行将是param3 = {,对于param4也是一样的,因此不包含任何实际值。我想我应该在调用值获取方法之前先解决它,在一行中搜索“{”,如果找到了它,那么在包含“{”的行下面的行中找到“;”的下一次迭代,在任何换行之间,制表符和空格都应该被删除。 这是我希望该方法在正确运行时显示的输出。你知道吗

param3 = {1,2,3,4,5,6};
param4 = {1,2,3,{4,5,6},};

这就是我正在使用的布局,formatFile(line)正是我需要帮助的方法。你知道吗

for root, dirs, files in os.walk(PATH_DST_SOURCE):
    for file in files:
        if file.endswith('.c'):
            with open(os.path.join(root, file), 'r') as this:
                for line in this:
                    formatFile(line)

不幸的是,我不知道如何做到这一点,并希望得到一些帮助,甚至推动在正确的方向。当然,如果有更好的方法来解决我的问题,那么这些也是受欢迎的!你知道吗


Tags: 方法in脚本for参数osdirline
3条回答

您可以这样尝试:拥有一个语句列表和一个包含当前语句的字符串;添加到当前语句,直到它以;结尾,然后将它添加到语句列表中。你知道吗

with open("file.c") as f:
    statements = []
    cur = ""
    for line in f:
        cur += line.strip()
        if cur.endswith(";"):
            statements.append(cur)
            cur = ""

当然,这是假设每个以;结尾的语句实际上都在行的末尾,而不是,例如,后跟一个行注释或另一个语句的一部分。如果您还想处理这些情况,事情会变得更加复杂(像代码在行注释或块注释中的语句,或字符串中的语句等等),您可能应该查找一些现有的解析器库。你知道吗

提出完全不同的解决方案。。。想一想……

将C文件解析为字符串通常是一项非常繁琐的工作,很容易出错。您可以尝试使用一些正则表达式,但通常您会发现自己会说:

  • 哦。。。我从没想过他们能在那里留个地方。。。你知道吗
  • 如果他们在这里发表评论。。。你知道吗
  • 如果有人加了无用的括号。。。你知道吗

如果你想构建健壮的代码,不要自己解析代码。。。试着找些能帮你的东西。 举个例子,我会尝试使用Swig接口访问C文件,然后直接访问变量。你知道吗

一般文件:http://www.swig.org/Doc1.3/Python.html

访问全局变量:http://www.swig.org/Doc1.3/Python.html#Python_nn16

如果你能使用这个解决方案,你唯一要做的就是写几行小的接口文件,把它作为Swig软件的输入,这将为你生成一个python模块,包装你的C文件。你知道吗

编辑:

在你的情况下,你可以这么做:

1.安装Swig 2.创建一个文件myInterface.i,如下所示:

/* File: myInterface.i */

%include "stdint.i"
%{
#include "file.h"
%}
extern uint8 param1;
extern uint8 param2;
  1. 运行命令swig -python myInterface.i这将为您的头文件生成一个python包装器。

  2. 在Python脚本中导入这个文件,并直接从头文件访问变量。

我不记得该怎么做阵列,但他们肯定也可以访问!你知道吗

你可以尝试一种简单的方法(不必逐行阅读):

with open(os.path.join(root, file), 'r') as this:
    content = this.read().replace('\n', '')  # whole file in one line
    content = content.replace(';', ';\n')    # add linebreak after each ';'
    lines = content.split('\n')  # now each line contains one parameter assignment

相关问题 更多 >

    热门问题