2016-01-12 3 views
2

У меня есть питон скриптКак я могу сделать этот скрипт 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 файлов разбросан во всех подкаталогах. Я хотел бы запустить ~/script.py во всех этих файлах html. Я сейчас делаю это с

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

Однако, это создает новый файл для каждого файла HTML в ~/webpage и я на самом деле хочу оригинальный файл отредактирован.

Это можно сделать изнутри python? Может быть, с чем-то вроде os.walk?

ответ

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) 
2

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

Генерировать имена файлов в дереве каталогов, идя дерево либо сверху вниз или снизу вверх. Для каждого каталога в дереве, укорененном в верхней части каталога (включая сам верх), он дает 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)) 
+0

Так что делает эти изменения устраняет ошибки, но как я могу использовать это, чтобы сохранить изменения в файлы? –

+0

Ну, вы можете написать документ, сгенерированный в файл. Я верну свой ответ на примере. – Bhargav

Смежные вопросы