如何让这个python脚本遍历目录树?

时间:2016-01-12 03:40:33

标签: python

我有一个python脚本

$ cat ~/script.py
import sys
from lxml import etree
from lxml.html import parse
doc = parse(sys.argv[1])
title = doc.find('//title')
title.text = span2.text.strip()
print etree.tostring(doc)

我可以通过发布类似

的内容在单个文件上运行脚本
$ python script.py foo.html > new-foo.html

我的问题是我有一个目录~/webpage,其中包含分散在子目录中的数百个.html个文件。我想在所有这些html文件上运行~/script.py。我目前正在使用

$ find ~/webpage/ -name "*.html" -exec sh -c 'python ~/script.py {} > {}-new' \;

但是,这会为~/webpage中的每个html文件创建一个新文件,我实际上想要编辑原始文件。

这可以从python中做到吗?也许有os.walk之类的东西?

2 个答案:

答案 0 :(得分:2)

The os module in python has a function specifically for walking down directories

  

通过从上到下或从下到上走树来生成目录树中的文件名。对于以目录top(包括top本身)为根的树中的每个目录,它会产生一个3元组(dirpath,dirnames,filenames)。

import os
import sys
from lxml import etree
from lxml.html import parse


def parse_file(file_name):
    doc = parse(file_name)
    title = doc.find('//title')
    title.text = span2.text.strip()
    print etree.tostring(doc)


for root, dirs, files in os.walk('/path/to/webpages'):
    for name in files:
        parse_file(os.path.join(root, name))

答案 1 :(得分:2)

import os

def process(file_name):
    with open(file_name) as readonly_file:
        print "Do something with %s ,size %d" % (file_name, len(readonly_file.read()))

def traverse(directory, callback=process):
    for dirpath, dirnames, filenames in os.walk(directory):
        for f in filenames:
            path = os.path.abspath(os.path.join(dirpath, f))
            callback(path)

print traverse('./')

请根据您自己的逻辑重写过程函数,此回调接受绝对路径作为唯一参数。

如果您只想要特定于流程的文件:

def traverse(directory, callback=process, file_type="txt"):
    for dirpath, dirnames, filenames in os.walk(directory):
        for f in filenames:
            path = os.path.abspath(os.path.join(dirpath, f))
            if path.endswith(file_type):
                callback(path)