python应用实例-linux源码整理
2016-12-04 19:03
375 查看
一、想要达到的目的
在写关于Linux TCP/IP协议栈的体会时,需要引用源码。但源码中有许多注释和空行,不利于页面排版。我想把一个源码文件中所有的注释和空行去掉,同时又能保留源文件中代码的行数,方便读者对照源码阅读。也就是如下右图的效果。黄色行号是vim显示的,红色行号是通过脚本处理后加入的。
![](https://img-blog.csdn.net/20161204191418227?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
二、怎么做
要的效果实际上是一个简单的文件处理。思路很简单:
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行。对排版来说,好多了。自己用的脚本,没有添加错误处理和完整的参数检查 :)。
在写关于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行。对排版来说,好多了。自己用的脚本,没有添加错误处理和完整的参数检查 :)。
相关文章推荐
- linux整理笔记之十:Raid与Lvm的综合应用实例
- 《中文版 SQL Server 2000 开发与管理应用实例》源码下载
- ARM的嵌入式Linux移植体验之应用实例
- linux下dd命令详解及应用实例
- JPEG 原理详细实例分析及其在嵌入式 Linux 中的应用
- linux的GPIO应用实例
- 基于ARM的嵌入式Linux移植真实体验(5)――应用实例
- ARM的嵌入式Linux移植体验之应用实例
- 菜鸟学Linux之九:LAMP部署之APACHE+MYSQL+PHP的应用实例
- PHP中实现汉字转区位码应用源码实例解析
- JPEG 原理详细实例分析及其在嵌入式 Linux 中的应用
- linux修改文件访问权限 : chmod :chown 应用实例
- JPEG 原理详细实例分析及其在嵌入式 Linux 中的应用
- JPEG 原理详细实例分析及其在嵌入式 Linux 中的应用
- 【编】linux下dd命令详解及应用实例
- ARM的嵌入式Linux移植体验之应用实例
- python整理十五——类文件应用
- [VB.NET源码]Instant VB.NET实例解析应用编程(PDF)
- LINUX高级应用之IPTABLES实例分析