Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将所有十六进制颜色值更改为rgb_Python_Parsing_Python 2.7 - Fatal编程技术网

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

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个或多个文件的脚本,并根据需要替换行 使用正则表达式查

我有大约50个css文件和200多个颜色条目。我需要将所有十六进制颜色值转换为rgb。有没有什么工具可以让我的任务变得简单,否则我必须打开每个css文件并手动执行

比如说

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
将为我们执行所有目录遍历,未来的选项将仅处理自给定日期以来更改的文件,或排除某些文件名或目录等。