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