python应用实例-linux源码整理

一、想要达到的目的

在写关于Linux TCP/IP协议栈的体会时,需要引用源码。但源码中有许多注释和空行,不利于页面排版。我想把一个源码文件中所有的注释和空行去掉,同时又能保留源文件中代码的行数,方便读者对照源码阅读。也就是如下右图的效果。黄色行号是vim显示的,红色行号是通过脚本处理后加入的。

二、怎么做

要的效果实际上是一个简单的文件处理。思路很简单:

1 把源文件打开,把输出文件打开。

2 记录行数,处理当前行。判断当前行是不是注释行,是不是空行。如果都不是,则把当前行数(在源文件中的行数)和当前行输出到输出文件中去。

3 关闭两个文件

三、具体实现(代码)

感谢linux源码编码格式的规格性。所以采用三个正则式就可以完善匹配和判断。现分享代码如下:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys
import re

if (len(sys.argv) != 2):
    print '''usage: python thisfile src.c. 
a src.c-post file is the post file'''
    exit()

input_file_name = sys.argv[1]
input_file = open(input_file_name)
output_file = open("%s-post"% input_file_name, 'w')
note_pattern1 = re.compile("[ \t]*/\*.*\*/") # /* ... */
note_pattern2_start = re.compile("[ \t]/\*\n")# /*
note_pattern2_end = re.compile("[ \t]*\*/") # */
index = 0
line_in_note = False

while True:
    read_in_line = input_file.readline()
    if read_in_line:
        index += 1
        if (note_pattern1.match(read_in_line)):
#            print 'find a /* ...  */ note'
            continue
        if (note_pattern2_start.match(read_in_line)):
#            print 'find a /* start'
            line_in_note = True
            continue
        if (note_pattern2_end.match(read_in_line)):
#            print 'find a /* end'           
            line_in_note = False
            continue
        if line_in_note: # in note block, so pass it.
            continue
        if len(read_in_line) >= 2: #when length is 1, it must be a blank line.
#            print index," ",read_in_line
            output_file.write("%d %s" % (index ,read_in_line))
    else:
        break

input_file.close()
output_file.close()

处理前103行的函数,现在只有53行。对排版来说,好多了。自己用的脚本,没有添加错误处理和完整的参数检查 :)。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值