我有一个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
之类的东西?
答案 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)