Анализатор Python — определение имен выходных файлов

#python #python-3.x #parsing #saxparser

#python #python-3.x #синтаксический анализ #saxparser

Вопрос:

Вопрос для начинающих — у меня есть анализатор Python SAX, который извлекает строки текста из файла .xml и записывает их в файл .txt. Теперь я хочу, чтобы он запускался для всех файлов в каталоге и выводил выходное имя файла из входного имени файла, но я не могу заставить это работать.

Сам анализатор работает нормально, поэтому в приведенном ниже коде я просто показал блоки, в которых указаны входные и выходные файлы. Есть предложения по простому способу сделать это?

 # Code begins

import sys
import re
from enum import Enum

sys.stdout = open("outputab123.txt", "w", encoding="UTF-8")

import xml.sax

# ~ 50 lines of SAX parser code

# Final block of code
   parser.parse("ab123.xml")
   sys.stdout.close()
  

Для каждого выходного файла .txt я просто хочу взять имя входного файла .xml и поместить «output» впереди.

Комментарии:

1. Вы рекурсивно анализируете все файлы в каталоге?

2. Да, или я хочу, по крайней мере.

Ответ №1:

Вы можете взять входное имя файла, разделить его, чтобы получить часть перед точкой, а затем добавить «output» и «.txt»:

 xmlfile = "ab123.xml"
txtfile = "output"   xmlfile.split(".")[0]   ".txt"
print(txtfile)
  

Вывод:

 outputab123.txt
  

Итак, в целом ваш код может выглядеть примерно так:

 listofiles = # define list of files here (eg. using glob)

for xmlfile in listoffiles:
    # parsing here
    parser.parse(xmlfile)
    sys.stdout.close()

    txtfile = "output"   xmlfile.split(".")[0]   ".txt"
    sys.stdout = open(txtfile, encoding="UTF-8")
    # write to text file here
  

Чтобы получить список .xml файлов в каталоге, вы можете использовать glob:

 listoffiles = glob.glob("/path/to/directory/*.xml")
  

Комментарии:

1. Спасибо. Используя этот подход, где я должен указать входной каталог? Я получаю сообщение об ошибке, как показано ниже: Трассировка (последний последний вызов): Файл «C:/Users/mypath/parser.py «, строка 5, в <module> для xmlфайла в listoffiles: Ошибка имени: имя ‘listoffiles’ не определено

2. listoffiles должно быть определено перед for циклом. Редактирование моего ответа.

3. Отличный материал — спасибо! Мне пришлось переработать одну строку как txtfile = xmlfile.split(".")[0] "output.txt" , чтобы она не помещала «output» в начало пути к файлу, и с этим изменением она делает именно то, что я хотел.