将所有十六进制颜色值更改为rgb

时间:2014-03-13 12:02:11

标签: python parsing python-2.7

我有大约50个css文件,其中包含200多个颜色条目。我需要将所有十六进制颜色值转换为rgb。是否有任何工具可以让我的任务变得轻松,否则我必须打开每个css文件并手动完成。

例如

color:#ffffff;

应转换为

color: rgb(255,255,255);

我对Python很满意,所以如果python中有一些东西可以让我的工作变得更轻松。非常好python method to do the hex to rgb conversion。但是如何在css文件中读取和替换所有颜色值...确定它们将以#。

开头

2 个答案:

答案 0 :(得分:10)

使用fileinput module创建一个可处理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

答案 1 :(得分:0)

Martijin's解决方案很棒。我之前并不知道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