如何从字典列表中筛选并写入文件?

2024-05-15 21:58:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我想对上一个问题做一些改进: How to format the dictionary object in the list of dictionaries?

打印(标签列表)

[[{'script': [{'domain': 'random.com', 'path': 'js/custom.js'}]},
 {'script': [{'domain': 'cdnjs.cloudflare.com',
              'path': '/ajax/libs/fancybox/2.1.5/jquery.fancybox.min.js'}]},
 {'link': [{'domain': 'random.com', 'path': 'css/bootstrap.min.css'}]},
 {'link': [{'domain': 'random.com', 'path': 'css/style.css'}]},
 {'link': [{'domain': 'random.com', 'path': 'css/responsive.css'}]},
 {'link': [{'domain': 'random.com',
            'path': 'css/jquery.mCustomScrollbar.min.css'}]},
 {'link': [{'domain': 'netdna.bootstrapcdn.com',
            'path': '/font-awesome/4.0.3/css/font-awesome.css'}]}]]

我想获取'domain'键中的所有数据,并将它们逐行存储在一个新文件domain.txt

domain.txt

random.com
cdnjs.cloudfare.com
netdna.bootstrapcdn.com

应该避免重复


Tags: thepathcomdomainjslinkscriptrandom
2条回答

一种方法:

data = [[{'script': [{'domain': 'random.com', 'path': 'js/custom.js'}]},
         {'script': [{'domain': 'cdnjs.cloudflare.com',
                      'path': '/ajax/libs/fancybox/2.1.5/jquery.fancybox.min.js'}]},
         {'link': [{'domain': 'random.com', 'path': 'css/bootstrap.min.css'}]},
         {'link': [{'domain': 'random.com', 'path': 'css/style.css'}]},
         {'link': [{'domain': 'random.com', 'path': 'css/responsive.css'}]},
         {'link': [{'domain': 'random.com',
                    'path': 'css/jquery.mCustomScrollbar.min.css'}]},
         {'link': [{'domain': 'netdna.bootstrapcdn.com',
                    'path': '/font-awesome/4.0.3/css/font-awesome.css'}]}]]

# open file for writing
with open("domain.txt", "w") as outfile:
    # create a set to check for duplicates
    seen = set()
    for top in data:
        for e in top:

            # get domain data either from script or link
            se = e.get("script") or e.get("link")

            # fetch the domain name
            domain = se[0]["domain"]

            # write if not previously seen
            if domain not in seen:
                seen.add(domain)
                outfile.write(f"{domain}\n")

输出

random.com
cdnjs.cloudflare.com
netdna.bootstrapcdn.com

看起来,大量的内部列表是不必要的,但如果您真的需要它们,那么这应该可以处理所有可能发生的情况:

taglist = [[{'script': [{'domain': 'random.com', 'path': 'js/custom.js'}]},
 {'script': [{'domain': 'cdnjs.cloudflare.com',
              'path': '/ajax/libs/fancybox/2.1.5/jquery.fancybox.min.js'}]},
 {'link': [{'domain': 'random.com', 'path': 'css/bootstrap.min.css'}]},
 {'link': [{'domain': 'random.com', 'path': 'css/style.css'}]},
 {'link': [{'domain': 'random.com', 'path': 'css/responsive.css'}]},
 {'link': [{'domain': 'random.com',
            'path': 'css/jquery.mCustomScrollbar.min.css'}]},
 {'link': [{'domain': 'netdna.bootstrapcdn.com',
            'path': '/font-awesome/4.0.3/css/font-awesome.css'}]}]]
D = set()
with open('domain.txt', 'w') as dfile:
    for tag in taglist:
        for subtag in tag:
            if (d := subtag.get('script', None)) is None:
                if (d := subtag.get('link', None)) is None:
                    continue
            for e in d:
                if (domain := e.get('domain', None)):
                    D.add(domain)
    for domain in D:
        print(domain, file=dfile)

[注意:这需要Python 3.8+]

相关问题 更多 >