Как пропустить строки, которые уже существуют в файле? - PullRequest
0 голосов
/ 17 февраля 2019

Я знаю, это кажется простой проблемой, но, пожалуйста, прочитайте мой вопрос.

Я хочу извлечь имена классов HTML, которые соответствуют следующему шаблону:

regex = re.compile(r'([\w-]+)-([#\w\d,%()\.]+)')

и записать егокак стиль CSS в другом файле.

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

keyword = {
'c':'color',
'bg':'background',
'red':'#ed1a1a',
'blue':'#60a8ff'
#etc
}

пример:

html-файл: <div class="c-red bg-blue"> content </div>

вывод в файл css:

.c-red{
color: red;
}
.bg-blue{
background: blue;
}

и вот мой скрипт, который в основном делает это:

regex = re.compile(r'([\w-]+)-([#\w\d,%()\.]+)')
with open('index.html', 'r') as file:
  with open('style.css', 'a+') as newfile:
    lines = file.readlines()
    for line in lines:
        if 'class="' in line:
          to_replace = regex.findall(line)
          for key in to_replace:         
              prop=key[0]  
              value=key[1] 
              name='.'+prop+'-'+value
              if prop and value in keyword:
                var1 =('\n'+name+'{'+
                  '\n'+keyword[prop]+': '+
                  keyword[value]+';'+
                  '\n'+'}')
                newfile.write(var1)

НО если у меня несколько похожих строк HTML, например:

<div class="c-red bg-blue"> content </div>
<div class="c-red bg-blue"> content2 </div>
<div class="c-red bg-blue"> content2 </div>

, сценарий будет писать команды CSS столько раз, сколько строк в файле HTML.

как мнепредотвратить это дублирование?

я пробовал:

var1=''

и

if var1 in newfile:
  break
else:
  newfile.write(var1)

, но ни один из них не работает.

Ответы [ 2 ]

0 голосов
/ 17 февраля 2019

Перед тем как написать запись добавьте в набор.Затем просто проверьте набор до написания.Это не будет проверять элементы, записанные в новый файл ранее

written = set()

regex = re.compile(r'([\w-]+)-([#\w\d,%()\.]+)')
with open('index.html', 'r') as file:
  with open('style.css', 'a+') as newfile:
    lines = file.readlines()
    for line in lines:
        if 'class="' in line:
          to_replace = regex.findall(line)
          for key in to_replace:         
              prop=key[0]  
              value=key[1] 
              name='.'+prop+'-'+value
              if prop and value in keyword:
                var1 =('\n'+name+'{'+
                  '\n'+keyword[prop]+': '+
                  keyword[value]+';'+
                  '\n'+'}')
                if var1 not in written: #check if you already wrote it
                    newfile.write(var1) # if not write it
                    written.add(var1) # you wrote it so add it the list of things you check against
0 голосов
/ 17 февраля 2019

Я отредактировал ваш код:

import re

keyword = {
'c':'color',
'bg':'background',
'red':'#ed1a1a',
'blue':'#60a8ff'
#etc
}

regex = re.compile(r'([\w-]+)-([#\w\d,%()\.]+)')
with open('index.html', 'r') as file:
    with open('style.css', 'a+') as newfile:
        content = newfile.read()

        lines = file.readlines()
        for line in lines:
                if 'class="' in line:
                    to_replace = regex.findall(line)
                    for key in to_replace:
                            name='.'+key[0]+'-'+key[1]
                            prop=key[0] 
                            value=key[1] 
                            if prop and value in keyword:
                                var1 =('\n'+name+'{'+ '\n' + keyword[prop] + ': ' + keyword[value] + ';' + '\n'+'}')

                                if not var1 in content:
                                    newfile.write(var1)
                                    content += var1

content = newfile.read() прочитает содержимое файла со стилем и сохранит его в переменной.Затем при каждом новом var1 он будет пытаться найти его в content, а если var1 здесь нет, он запишет его в файл и добавит в переменную content.

Вывод:

.c-red{
color: #ed1a1a;
}
.bg-blue{
background: #60a8ff;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...