Чтение в части файла, остановка и запуск с определенных слов

Я использую python 2.7, и мне назначили (самонаправленное присваивание, я написал эти инструкции), чтобы написать небольшой статический генератор html, и мне бы хотелось, чтобы помощь в поиске ресурсов, ориентированных на новы к питону, для чтения частей файлов одновременно. Если кто-то дает ответы на код, это здорово, но я хочу понять, почему и как работает python. Я могу купить книги, но не дорогие - я могу позволить себе поставить на этот счет в тридцать, может быть, сорок долларов.

Как предполагается, что эта программа работает, есть файл template.html, файл message.txt, файл изображения, архив .html и файл output.html. Это больше информации, чем вам нужно, но основной идеей, которую я имел, было "идти туда и обратно, читая из шаблона и сообщения, помещая их содержимое в вывод, а затем записывая в архив, что выход существует". Но я еще не пришел туда, и я не прошу вас решить всю эту проблему, как я подробно остановился ниже:

Программа читает в html из template.html, останавливаясь при открытии тега, затем читает, в каком заголовке страницы будет указано message.txt, Вот где я сейчас. Оно работает! Я был так счастлив... несколько часов назад, когда я понял, что это не последний босс.

#doctype to title
copyLine = False
for line in template.readlines():
 if not '<title>' in line:
 copyLine = True
 if copyLine:
 outputhtml.write(line)
 copyLine = False
else:
 templateSeek = template.tell()
 break
#read name of message
titleOut = message.readline()
print titleOut, " is the title of the new page"
#--------
##5. Put the title from the message file in the head>title tag of the output file
#--------
titleOut = str(titleOut)
titleTag = "<title>"+titleOut+"|Circuit Salsa</title>"
outputhtml.write(titleTag)

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

Это два последних метода, которые я пробовал (без успеха):

block = ""
found = False
print "0"
for line in template:
 if found:
 print "1"
 block += line
 if line.strip() == "<h1><code>": break
else:
 if line.strip() == "":
 print "2"
 found = True
 block = ""
print block + "3"
</code>
<p>были напечатаны только точки 0 и 3. Я помещаю там печать # потому что я не мог понять, почему мой выходной файл не изменился.</p>
<pre class="prettyprint linenums">template.seek(templateSeek)
copyLine = False
for line in template.readlines():
 if not '<a>' in line:
 copyLine = True
 if copyLine:
 outputhtml.write(line)
 copyLine = False
 else:
 templateSeek = template.tell()
 break 
</a>

С другой, я уверен, что просто делаю все неправильно.

3 ответа

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


В первой попытке у вас есть проблема с отступом. Предложение else имеет тот же уровень отступа, что и оператор for, поэтому вместе они образуют состав для: else: структуры управления. Новые программисты на Python часто путаются этим. Предложение else: выполняется только в том случае, если цикл for работает до конца, не встречая оператора break. По-видимому, в вашем случае оператор break выполняется, поэтому в else: clause нет. Предложение else: вне цикла, поэтому "found" никогда не получает значение True. Я думаю, что если вы сделаете отступ в другом: предложение вам понравится результат. Также я думаю, что вы можете удалить вызовы strip() и вместо этого использовать такие выражения, как "if" в строке: "и т.д.

Я подозреваю, что вы правы в отношении второй функции. Мне это вообще не имеет смысла.


Я бы использовал BeautifulSoup. Альтернативой является использование регулярных выражений, которые хорошо знать в любом случае. Я знаю, что они выглядят довольно устрашающе, но на самом деле их не так сложно изучить (мне потребовался час или около того). Например, чтобы получить все теги ссылок, вы можете сделать что-то вроде

from re import findall, DOTALL
html = '''



 <title>My awesome web page!</title>


 <h2>Sites I like</h2>
 <ul>
 <li><a href="https://www.google.com/">Google</a></li>
 <li><a href="https://www.facebook.com">Facebook</a></li>
 <li><a href="http://www.amazon.com">Amazon</a></li>
 </ul>
 <h2>My favorite foods</h2>
 <ol>
 <li>Pizza</li>
 <li>French Fries</li>
 </ol>


'''
def find_tag(src, tag):
 return findall(r'<{0}.*?>.*?<!--{0}-->'.format(tag), src, DOTALL)
print find_tag(html, 'a')
# ['<a href="https://www.google.com/">Google</a>', '<a href="https://www.facebook.com">Facebook</a>', '<a href="http://www.amazon.com">Amazon</a>']
print find_tag(html, 'li')
# ['<li><a href="https://www.google.com/">Google</a></li>', '<li><a href="https://www.facebook.com">Facebook</a></li>', '<li><a href="http://www.amazon.com">Amazon</a></li>', '<li>Pizza</li>', '<li>French Fries</li>']
print find_tag(html, 'body')
# ['\n <h2>Sites I like</h2>\n <ul>\n <li><a href="https://www.google.com/">Google</a></li>\n <li><a href="https://www.facebook.com">Facebook</a></li>\n <li><a href="http://www.amazon.com">Amazon</a></li>\n </ul>\n\n <h2>My favorite foods</h2>\n <ol>\n <li>Pizza</li>\n <li>French Fries</li>\n </ol>\n']

Я надеюсь, что вы найдете хотя бы часть этого полезного. Если у вас есть какие-либо последующие вопросы, прокомментируйте мой ответ. Удачи!

licensed under cc by-sa 3.0 with attribution.