WEB开发网
开发学院软件开发Python 如何编写Unix管道风格的Python代码 阅读

如何编写Unix管道风格的Python代码

 2010-09-22 11:10:40 来源:WEB开发网   
核心提示: 管道风格的程序下面考虑用 Unix 的工具和管道我们会如何完成这个任务:find logdir -name "access-log*" |xargs cat |grep '[^-]$' |awk '{ total += $NF } END { p

管道风格的程序

下面考虑用 Unix 的工具和管道我们会如何完成这个任务:

find logdir -name "access-log*" |
xargs cat |
grep '[^-]$' |
awk '{ total += $NF } END { print total }'

find 根据文件名 pattern 找到文件,cat 把所有文件内容合并输出到 stdout,grep 从 stdin 读入,过滤掉行末为 ‘-’ 的行,awk 提取每行最后一列,将数值相加,最后打印出结果。(省掉 cat 是可以的,但这样一来 grep 就需要直接读文件而不是只从标准输入读。)

我们可以在 python 代码中模拟这些工具,Unix 的工具通过文本来传递结果,在 python 中可以使用 list。

def find(topdir, filepat, processfunc):
  files = []
  for path, dirlist, filelist in os.walk(top):
    for name in fnmatch.filter(filelist, filepat):
      files.append(name)
  return files
def cat(files):
  lines = []
  for file in files:
    with open(file) as f:
      for line in f:
        lines.append(line)
  return lines
def grep(pattern, lines):
  result = []
  import re
  pat = re.compile(pattern)
  for line in lines:
    if pat.search(line):
      result.append(line)
  resurn result
lines = grep('[^-]$', cat(find('logdir', 'access-log*')))
col = (line.rsplit(None, 1)[1] for line in lines)
print sum(int(c) for c in col)

有了 find, cat, grep 这三个函数,只需要连续调用就可以像 Unix 的管道一样将这些函数组合起来。数据在管道中的变化如下图(简洁起见,过滤器直接标在箭头上 ):

如何编写Unix管道风格的Python代码

看起来现在的代码行数比最初直接用 for 循环的代码要多,但现在的代码就像 Unix 的那些小工具一样,每一个都更加可能被用到。我们可以把更多常用的 Unix 工具用 Python 来模拟,从而在 Python 代码中以 Unix 管道的风格来编写代码。

上一页  1 2 3 

Tags:如何 编写 Unix

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接