gpt4 book ai didi

Python 字典键缺失

转载 作者:行者123 更新时间:2023-11-30 23:58:35 25 4
gpt4 key购买 nike

我想我应该编写一个快速脚本来整合我分布在多个 CSS 文件中的 CSS 规则,然后我可以缩小它。

我是 Python 新手,但认为这将是尝试新语言的一个很好的练习。我的主循环没有像我想象的那样解析 CSS。

我使用从 CSS 文件解析的选择器填充列表,以按顺序返回 CSS 规则。稍后在脚本中,列表包含字典中未找到的元素。

    for line in self.file.readlines():
if self.hasSelector(line):
selector = self.getSelector(line)
if selector not in self.order:
self.order.append(selector)
elif selector and self.hasProperty(line):
# rules.setdefault(selector,[]).append(self.getProperty(line))
property = self.getProperty(line)
properties = [] if selector not in rules else rules[selector]
if property not in properties:
properties.append(property)
rules[selector] = properties
# print "%s :: %s" % (selector, "".join(rules[selector]))
return rules

遇到错误:

$ css-combine combined.css test1.css test2.css 
Traceback (most recent call last):
File "css-combine", line 108, in <module>
c.run(outfile, stylesheets)
File "css-combine", line 64, in run
[(selector, rules[selector]) for selector in parser.order],
KeyError: 'p'

交换输入:

$ css-combine combined.css test2.css test1.css 
Traceback (most recent call last):
File "css-combine", line 108, in <module>
c.run(outfile, stylesheets)
File "css-combine", line 64, in run
[(selector, rules[selector]) for selector in parser.order],
KeyError: '#header_.title'

我在代码中做了一些奇怪的事情,例如字典键名称中下划线的子空格,以防出现问题 - 也许这是一种良性的预防措施?根据输入的顺序,在字典中找不到不同的键。

脚本:

#!/usr/bin/env python

import optparse
import re

class CssParser:

def __init__(self):
self.file = False
self.order = [] # store rules assignment order

def parse(self, rules = {}):
if self.file == False:
raise IOError("No file to parse")

selector = False
for line in self.file.readlines():
if self.hasSelector(line):
selector = self.getSelector(line)
if selector not in self.order:
self.order.append(selector)
elif selector and self.hasProperty(line):
# rules.setdefault(selector,[]).append(self.getProperty(line))
property = self.getProperty(line)
properties = [] if selector not in rules else rules[selector]
if property not in properties:
properties.append(property)
rules[selector] = properties
# print "%s :: %s" % (selector, "".join(rules[selector]))
return rules

def hasSelector(self, line):
return True if re.search("^([#a-z,\.:\s]+){", line) else False

def getSelector(self, line):
s = re.search("^([#a-z,:\.\s]+){", line).group(1)
return "_".join(s.strip().split())

def hasProperty(self, line):
return True if re.search("^\s?[a-z-]+:[^;]+;", line) else False

def getProperty(self, line):
return re.search("([a-z-]+:[^;]+;)", line).group(1)


class Consolidator:
"""Class to consolidate CSS rule attributes"""

def run(self, outfile, files):
parser = CssParser()
rules = {}
for file in files:
try:
parser.file = open(file)
rules = parser.parse(rules)
except IOError:
print "Cannot read file: " + file
finally:
parser.file.close()

self.serialize(
[(selector, rules[selector]) for selector in parser.order],
outfile
)

def serialize(self, rules, outfile):
try:
f = open(outfile, "w")
for rule in rules:
f.write(
"%s {\n\t%s\n}\n\n" % (
" ".join(rule[0].split("_")), "\n\t".join(rule[1])
)
)
except IOError:
print "Cannot write output to: " + outfile
finally:
f.close()

def init():
op = optparse.OptionParser(
usage="Usage: %prog [options] <output file> <stylesheet1> " +
"<stylesheet2> ... <stylesheetN>",
description="Combine CSS rules spread across multiple " +
"stylesheets into a single file"
)
opts, args = op.parse_args()
if len(args) < 3:
if len(args) == 1:
print "Error: No input files specified.\n"
elif len(args) == 2:
print "Error: One input file specified, nothing to combine.\n"
op.print_help();
exit(-1)

return [opts, args]

if __name__ == '__main__':
opts, args = init()
outfile, stylesheets = [args[0], args[1:]]
c = Consolidator()
c.run(outfile, stylesheets)

测试CSS文件1:

body {
background-color: #e7e7e7;
}

p {
margin: 1em 0em;
}

文件2:

body {
font-size: 16px;
}

#header .title {
font-family: Tahoma, Geneva, sans-serif;
font-size: 1.9em;
}

#header .title a, #header .title a:hover {
color: #f5f5f5;
border-bottom: none;
text-shadow: 2px 2px 3px rgba(0, 0, 0, 1);
}

提前致谢。

最佳答案

改变

def hasProperty(self, line):
return True if re.search("^\s?[a-z-]+:[^;]+;", line) else False

def hasProperty(self, line):
return True if re.search("^\s*[a-z-]+:[^;]+;", line) else False

hasProperty 未匹配任何内容,因为 \s? 仅匹配 0 或 1 个空白字符。

关于Python 字典键缺失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2980375/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com