Python 将所有十六进制颜色值更改为rgb
我有大约50个css文件和200多个颜色条目。我需要将所有十六进制颜色值转换为rgb。有没有什么工具可以让我的任务变得简单,否则我必须打开每个css文件并手动执行 比如说Python 将所有十六进制颜色值更改为rgb,python,parsing,python-2.7,Python,Parsing,Python 2.7,我有大约50个css文件和200多个颜色条目。我需要将所有十六进制颜色值转换为rgb。有没有什么工具可以让我的任务变得简单,否则我必须打开每个css文件并手动执行 比如说 color:#ffffff; 应转换为 color: rgb(255,255,255); 我对Python很熟悉,所以如果Python中有什么东西可以让我的工作更轻松的话。有非常好的。但是如何读取和替换css文件中的所有颜色值。。当然,它们将以#开头。使用创建可以处理1个或多个文件的脚本,并根据需要替换行 使用正则表达式查
color:#ffffff;
应转换为
color: rgb(255,255,255);
我对Python很熟悉,所以如果Python中有什么东西可以让我的工作更轻松的话。有非常好的。但是如何读取和替换css文件中的所有颜色值。。当然,它们将以#开头。使用创建可以处理1个或多个文件的脚本,并根据需要替换行
使用正则表达式查找十六进制RGB值,并考虑有两种格式#fff
和#ffffff
。替换每种格式:
import fileinput
import sys
import re
_hex_colour = re.compile(r'#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})\b')
def replace(match):
value = match.group(1)
if len(value) == 3: # short group
value = [str(int(c + c, 16)) for c in value]
else:
value = [str(int(c1 + c2, 16)) for c1, c2 in zip(value[::2], value[1::2])]
return 'rgb({})'.format(', '.join(value))
for line in fileinput.input(inplace=True):
line = _hex_colour.sub(replace, line)
sys.stdout.write(line)
正则表达式查找一个#
,后跟3或6个十六进制数字,后跟一个单词边界(表示后面不能是字符、数字或下划线字符);这确保了我们不会在某个地方意外地匹配更长的十六进制值
通过将每个十六进制数字加倍来转换#hhh
(3位)模式#abc
等同于#aabbcc
。十六进制数字转换为整数,然后转换为字符串以便于格式化,然后放入rgb()
字符串中并返回替换
fileinput
模块将从命令行获取文件名;如果将其另存为Python脚本,则:
python scriptname.py filename1 filename2
将转换这两个文件。如果没有文件名,则使用stdin。解决方案非常好。我不知道fileinput模块,所以之前我读取每个文件,在临时文件中传输替换文件,并删除旧文件,但fileinput使其非常平滑和快速。这是我的脚本,它需要一个文件夹作为当前目录的参数,并将遍历和查找所有css文件并替换颜色。可以进一步改进错误处理
import fileinput
import os
import sys
import re
_hex_colour = re.compile(r'#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})\b')
_current_path = os.getcwd() #folder arg should be from current working directory
_source_dir=os.path.join(_current_path,sys.argv[1]) #absolute path
cssfiles = []
def replace(match):
value = match.group(1)
if len(value) == 3: # short group
value = [str(int(c + c, 16)) for c in value]
else:
value = [str(int(c1 + c2, 16)) for c1, c2 in zip(value[::2], value[1::2])]
return 'rgb({})'.format(', '.join(value))
for dirpath, dirnames, filenames in os.walk (_source_dir):
for file in filenames:
if file.endswith(".css"):
cssfiles.append(os.path.join(dirpath,file))
try:
for line in fileinput.input(cssfiles,inplace=True):
line = _hex_colour.sub(replace, line)
sys.stdout.write(line)
print '%s files have been changed'%(len(cssfiles))
except Exception, e:
print "Error: %s"%(e) #if something goes wrong
如果使用SASS,可以通过计算将十六进制转换为rgb@西格玛:但这仍然需要处理这50个文件,才能将它们转换为使用SASS,不是吗?投票重新打开;这不是要求我们推荐或查找工具、库或非现场资源的问题。这是一个“给定50个文件,我如何解决这个问题”的问题。这个问题似乎离题了,因为它不包括尝试的解决方案,以及为什么它们没有按照@martineau:see;OP显然已经投入了一些努力,试图找出完成这项任务需要什么。@Martijin对我来说很好,让我对我的文件进行一次测试,其中文件在单个文件中有多达200个不同颜色的条目typo:rbg而不是rgbworked perfect,但有两个更正它应该是“inplace=True”正如@ddelemeny所指出的,它应该是rgb..@MartijnPieters,我发布了一个我正在使用的工具,也许你可以建议更优化的os.walk方法或其他技巧。@DevC:我通常依赖UNIX工具包;在灵活性和力量方面,很难击败
查找find somedir-name\*.css | xargs python scriptname.py
将为我们执行所有目录遍历,未来的选项将仅处理自给定日期以来更改的文件,或排除某些文件名或目录等。