Как написать скрипт удаления тега в python - PullRequest
1 голос
/ 04 октября 2010

Я хочу реализовать скрипт для чтения файлов (папок и подпапок), который обнаруживает некоторые теги и удаляет эти теги из файлов.

Это файлы .cpp, .h .txt и .xml И онисотни файлов в одной папке.

Я не имею представления о Python, но люди сказали мне, что я могу легко это сделать.

ПРИМЕР :

Моя главная папка A: C: \ A

Внутри A у меня есть папки (B, C, D) и некоторые файлы A.cpp Ah A.txt и A.xml.В B у меня есть папки B1, B2, B3 и некоторые из них имеют больше подпапок, а также файлы .cpp, .xml и .h ....

  • xml, содержат некоторые тегинапример, <!-- $Mytag: some text$ -->

  • .h и .cpp файлы содержат теги другого типа, например //$TAG some text$

  • .txt имеют теги различных форматов:#$This is my tag$

Он всегда начинается и заканчивается символом $, но всегда содержит символ комментария (//,

Идея состоит в том, чтобы запустить один скрипт и удалить все теги из всехфайлы, поэтому скрипт должен:

  • читать папки и подпапки
  • открывать файлы и находить теги
  • Если они есть, удалять и сохранять файлы с изменениями

ЧТО Я ИМЕЮ:

import  os

for root, dirs, files in os.walk(os.curdir):

 if files.endswith('.cpp'):
  %Find //$ and delete until next $
 if files.endswith('.h'):
  %Find //$ and delete until next $
 if files.endswith('.txt'):
  %Find #$ and delete until next $
 if files.endswith('.xml'):
  %Find <!-- $ and delete until next $ and -->

Ответы [ 2 ]

3 голосов
/ 04 октября 2010

Общее решение будет следующим:

  1. использовать функцию os.walk() для обхода дерева каталогов.
  2. Перебирайте имена файлов и используйте fn_name.endswith('.cpp') с if / elseif, чтобы определить, с каким файлом вы работаете
  3. . Используйте модуль re, чтобы создать регулярное выражение, которое вы можете использовать для определенияесли строка содержит ваш тег
  4. Откройте целевой файл и временный файл (используйте модуль tempfile).Перебирайте исходный файл построчно и выводите отфильтрованные строки в ваш временный файл.
  5. Если какие-либо строки были заменены, используйте os.unlink() плюс os.rename() для замены вашего исходного файла

Это тривиальное упражнение для адепта Python, но для кого-то нового в языке,вероятно, потребуется несколько часов, чтобы начать работать.Вы, вероятно, не могли попросить лучшего задания, чтобы познакомиться с языком, хотя.Удачи!

----- Обновление -----

Атрибут files, возвращаемый os.walk, представляет собой список, поэтому вам нужно будет итерировать по нему.,Кроме того, атрибут files будет содержать только базовое имя файла.Вам нужно будет использовать значение root вместе с os.path.join(), чтобы преобразовать его в полное имя пути.Попробуйте сделать следующее:

for root, d, files in os.walk('.'): 
    for base_filename in files: 
        full_name = os.path.join(root, base_filename)
        if full_name.endswith('.h'):
            print full_name, 'is a header!'
        elif full_name.endswith('.cpp'):
            print full_name, 'is a C++ source file!'

Если вы используете Python 3, операторы print должны быть вызовами функций, но общая идея остается прежней.

1 голос
/ 05 октября 2010

Попробуйте что-то вроде этого:

import os
import re

CPP_TAG_RE = re.compile(r'(?<=// *)\$[^$]+\$')

tag_REs = {
    '.h': CPP_TAG_RE,
    '.cpp': CPP_TAG_RE,
    '.xml': re.compile(r'(?<=<!-- *)\$[^$]+\$(?= *-->)'),
    '.txt': re.compile(r'(?<=# *)\$[^$]+\$'),
}

def process_file(filename, regex):
    # Set up.
    tempfilename = filename + '.tmp'
    infile = open(filename, 'r')
    outfile = open(tempfilename, 'w')

    # Filter the file.
    for line in infile:
        outfile.write(regex.sub("", line))

    # Clean up.
    infile.close()
    outfile.close()

    # Enable only one of the two following lines.
    os.rename(filename, filename + '.orig')
    #os.remove(filename)

    os.rename(tempfilename, filename)

def process_tree(starting_point=os.curdir):
    for root, d, files in os.walk(starting_point): 
        for filename in files:
            # Get rid of `.lower()` in the following if case matters.
            ext = os.path.splitext(filename)[1].lower()
            if ext in tag_REs:
                process_file(os.path.join(root, base_filename), tag_REs[ext])

Хорошая особенность os.splitext в том, что она правильно делает для имен файлов, начинающихся с ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...