Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
复制C文件中定义行的Python脚本_Python_C_Header - Fatal编程技术网

复制C文件中定义行的Python脚本

复制C文件中定义行的Python脚本,python,c,header,Python,C,Header,我的剧本有点问题。我的任务是读入一堆用c文件编写的.h文件,我能够使用: myfiles glob.glob'*.h' 但我所面临的困难是,一旦这些文件被读入,我需要将define行粘贴到define行下面并进行更改。我知道,但举个例子: #ifndefine _THIS_CODE_NEEDS_COPIED_H #define _THIS_CODE_NEEDS_COPIED_H #define THIS_CODE_NEEDS_COPIED_VERSION "10" <----thats

我的剧本有点问题。我的任务是读入一堆用c文件编写的.h文件,我能够使用:

myfiles glob.glob'*.h'

但我所面临的困难是,一旦这些文件被读入,我需要将define行粘贴到define行下面并进行更改。我知道,但举个例子:

#ifndefine _THIS_CODE_NEEDS_COPIED_H
#define _THIS_CODE_NEEDS_COPIED_H

#define THIS_CODE_NEEDS_COPIED_VERSION "10" <----thats what I need to add! 
                                        Noting: it loses one underscore 
                                    after define and the H is changed to
                                   VERSION with a String "10" at the end.

是的,看起来很简单,但我不知道如何逐字阅读python。有什么建议吗?!注意,这是一个新的行复制,然后在其他行下面编辑。此外,这是许多文件。这个有几百个!他们所有的定义在他们之后都读到了不同的东西,比如:另一个可能是定义,这是不同的,所以他们不会说同样的话。求求你,救命!我的大脑再也受不了了

在Python中执行此操作不需要逐个字符读取。这可以用更少的代码行完成,但比现在更难看、更难理解:

with open("input_file.txt", "rb") as f:  # you can use glob or os.walk as needed to get input files
    with open("output_file.txt", "w") as out:  # output file, adjust as needed
        for line in f:  # iterate through each line
            new_line = line  # make new_line to be written equal to current line
            if line.startswith("#define"):
                tokens = line.strip().split(' ')
                sp = 1 if tokens[-1].startswith('_') else 0  # skip initial underscore if present by adjusting start position (sp)
                def_list = tokens[-1][sp:].split('_')
                if def_list[-1] == 'H':
                    def_list[-1] = 'VERSION'
                    new_line = '_'.join(def_list) + ' "10"'
            out.write("%s\n" % new_line)  # write new_line to file

这将根据需要更改行,并按原样将未受影响的行写入新文件。如果需要将下划线前缀添加到需要更改且可以修改的前缀中,则当前此脚本通过调整起始位置sp来处理该前缀。

这听起来像是和模块的作业:

注:

对的调用迭代列表中作为第一个参数传入的文件

fileinput.input的inplace参数表示您正在在位编辑文件。也就是说,这些文件将被程序写入标准输出的任何内容所替换

正则表达式就是您所说要寻找的那种定义。此外,其中的括号捕获该匹配的子字符串

在循环内部,我们通过写入每个文件的每一行来维护现有内容。此外,如果我们看到魔术的定义,那么我们就多写一行

realstdout的业务提供了修改哪些文件以及检测到哪些模式的日志


这不是你昨天发布的问题的副本吗?为什么不编辑而不是再次发布它呢?请发布你的Python代码。我的代码已经运行了,但是如果你感兴趣,我发布了另一个问题,我已经挣扎了好几天了。它涉及同一行,并进行比较。@AleksanderLidtke顺便说一句,你的个人资料说你想制造一艘宇宙飞船,这很有趣,因为尽管我的Python很小,但我实际上是一名为制造飞机和宇宙飞船的人设计的软件工程师space@Meg.Pazzaglia哦,太酷了,哪家公司?非常感谢你,这工作做得很好!我的正则表达式有点不稳定,所以难怪我不能让它工作。请点击答案附近的向上箭头,向上投票你认为有用的每个答案。如果有一个答案完全回答了您的问题,请单击复选标记接受。谢谢Rob!对于Python帮助,您有什么建议吗?有关具体问题,请询问堆栈溢出。为了获得一般知识,请尝试回答一些有关堆栈溢出的问题。要从头开始学习Python,请尝试。关于如何使用filecmp扫描目录中的一行,有什么建议吗?我知道如何处理一个文件到另一个文件,但如何处理整个目录?
import fileinput
import glob
import re
import sys

files = glob.glob('*.h')
pattern = re.compile(r'#define\s+_([_A-Z]+)_H\s+$')
realstdout = sys.stdout

for line in fileinput.input(files, inplace=True, backup='.bak'):
    sys.stdout.write(line)
    m = pattern.match(line)
    if m:
        sys.stdout.write('\n#define %s_VERSION "10"\n' % m.group(1))
        realstdout.write('%s: %s\n'%(fileinput.filename(),m.group(1)))