Я новичок в Python и имею проблемы с этим циклическим кодом - PullRequest
0 голосов
/ 18 октября 2010

Я пытаюсь скопировать разделы в файле внутри набора тегов XML

> <tag>I want to copy the data here</tag>`
  • Обратите внимание, я обнаружил, что данные вокруг тегов не являются допустимыми XML, поэтому я не могу импортировать обычную библиотеку и должен найти ее с помощью сравнения строк :( *

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

InputFile=open('xml_input_File.xml','r')
OutputFile=open('xml_output_file.xml', 'w')
check = 0

for line in InputFile.readlines():
      if line.find("<STARTTAG>"):
          check = 1
      elif line.find(r"<//STARTTAG>"):
          check = 0
      if check == 1:
          OutputFile.write(line)

У меня проблема в том, что он просто копирует весь файл, а не только те разделы, которые мне нужны.

Я знаю, что код не очень красивый, но я все еще учусь, и он будет "черт возьми!" момент, но спасибо за вашу помощь !!

Приветствия

Ответы [ 3 ]

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

Есть несколько проблем с вашим кодом:

  • Если ввод действительно в формате "<STARTTAG> ... </STARTTAG>", захват строк не обрежет его, так как вы собираетесь захватить по крайней мереэкземпляр <STARTTAG>.
  • Вы используете префикс буквенной строки (r"<//STARTTAG>"), но используете две косые черты.Из приведенного выше примера видно, что закрывающие теги имеют только одну косую черту.Я не уверен, зачем вам вообще нужен здесь префикс литеральной строки.Если это неверно, возможно, поэтому переменная check никогда не устанавливается в 0 (следовательно, код копирует весь файл).

Редактировать: точка, которую другие авторы указали относительно возвращаемого значения find() тоже очень актуально.Лучше всего использовать ключевое слово in.

Вам нужно разобраться в разбиении ввода (синтаксический анализ), либо вручную (через split ()), либо с помощью некоторых регулярных выражений.В качестве альтернативы, вы можете попытаться преобразовать свой ввод в совместимый формат XML, а затем использовать одну из многих свободно доступных библиотек для обработки такого рода вещей.

Надеюсь, это поможет!

0 голосов
/ 18 октября 2010

find возвращает индекс подстроки в строке. Вероятно, этот стартовый тег находится в начале строки (индекс равен нулю), поэтому, если он не работает должным образом.

Попытка:

if line.find("<STARTTAG>") != -1:

или даже лучше

if "<starttag>" in line:

или используйте синтаксический анализатор XML для python.

0 голосов
/ 18 октября 2010
Help on method_descriptor:

find(...)
    S.find(sub[, start[, end]]) -> int

    Return the lowest index in S where substring sub is found,
    such that sub is contained within s[start:end].  Optional
    arguments start and end are interpreted as in slice notation.

    Return -1 on failure.

-1 также является значением True.

try:

if "<STARTTAG>" in line:

и т. Д.

Кроме того, косая черта не требуетсябыть экранированным (еще меньше в необработанных строках!).

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