字典从字符

时间:2016-08-31 03:38:10

标签: python dictionary

我正在尝试解析然后编辑{}之间的文本。信息是不同的(在大括号之间)所以我需要能够在某种类型的缓冲区中分离这些结果,以测试每个结果的/ test和/ example。

文件中的信息

server {
    listen 80;
    listen 443 ssl;
    server_name example.com;
    rewrite /test redirectexample.com/test permanent;
    rewrite /  http://redirectedexample.com permanent;
}

server {
    listen 80;
    listen 443 ssl;
    server_name test.com;
    rewrite /example testing.com/example permanent;
    rewrite /  http://www.testing.com permanent;
}

脚本

import.os
InputFile= open('/tmp/redirect.conf', 'r')
dict = {}

file =InputFile.readlines()

parsing = False
for line in file:
    if line.startswith("}"):
        parsing = False
    if parsing:
        # Run some command here        
    if line.startswith("server {"):
        parsing = True

我不知道从哪里开始调用字典,因为我想以某种方式调用第一个server {}之间的所有内容。最终目标是能够运行curl来测试example.com/test重定向,test.com/example重定向从此获取输出并将其与我们的配置文件中的当前差异进行区分。这样做的目的是在移动它们之前对它们进行审核,以避免保留不再需要的配置。我很难找到这方面的信息,如果有一个文件,我需要RTFM,那么请随时删除链接。

修改

寻找脚本的事情:

  1. 获取nginx服务器块并获取“server_name”的值

  2. 重写/测试/示例的抓取值< - 实际字符串是随机的

  3. 使用curl -w "%{url_effective}\n" -I -L -s -S $m -o /dev/null

  4. 测试这两个值
  5. 然后将卷曲输出差异化为重写。

  6. 请注意,我不需要解析example.com/example,因为/ example重定向位于不同的服务器块中。

    希望自此以后做得更多。因此有数以千计的服务器块。

1 个答案:

答案 0 :(得分:0)

这是一种将数据拆分为嵌套列表然后构造一个dict的方法。我主要猜测所需的数据结构。免责声明:使用正则表达式可能有一种更有效的方法,如果将整个文件读入内存将是一个问题,这种方法并不理想。

import itertools


def isplit(iterable, splitters):  # thank you http://stackoverflow.com/a/4322780/6085135
    return [list(g) for k,g in itertools.groupby(iterable,lambda x:x in splitters) if not k]


with open('example.txt', 'r') as f:
    data = f.read()

# split the data into lists
data = data.replace('{', '').replace('}', '').replace(';', ' ;')
data = data.split()
data = isplit(data, ('server',))

# construct dict from sublists
servers = {}
for block in data:
    block = isplit(block, (';',))
    server = {}
    for item in block:
        key, value = item[0], ' '.join(item[1:])
        if key not in server.keys():
            server[key] = value
        else:
            if isinstance(server[key], list):
                server[key] = server[key].append(value)
            else:
                server[key] = [server[key], value]
    server_name = server.pop('server_name')
    servers.update({server_name: server})

print(servers)

输出:

{
  'test.com': 
    {
      'listen': ['80', '443 ssl'], 
      'rewrite': ['/example testing.com/example permanent', '/ http://www.testing.com permanent']
    }, 
  'example.com': 
    {
      'listen': ['80', '443 ssl'], 
      'rewrite': ['/test redirectexample.com/test permanent', '/ http://redirectedexample.com permanent']
    }
}