簡體   English   中英

Python CSV到JSON數組對象,具有來自CSV的唯一值,作為一個JSON對象,其中不止一個

[英]Python CSV to JSON Array Objects with unique values from CSV as one JSON Object where more than one

擁有此CSV:

Domain,IP,Server,PoweredBy,MetaGenerator,Email
http://www.example1.com,1.1.1.1,,,,
http://www.example2.com,2.2.2.2,Apache,PHP/5.5.9-1ubuntu4.20,,
http://www.example3.com,3.3.3.3,Apache,PHP/5.5.9-1ubuntu4.20,Easy Digital Downloads v2.4.9;Powered by Visual Composer - drag and drop page builder for WordPress.,info@example3.com;sales@example3.com

嘗試構建一個對象的JSON數組,其中每個對象都是許多CSV值(由“;”分隔)的唯一組合,即

如我們所見,www.example3.com有不同的MetaGenerators和電子郵件

對於這種情況,對象的JSON數組應如下所示,每個組合均作為數組中的JSON對象:

[{'Domain': 'http://www.example1.com',
  'Email': '',
  'IP': '1.1.1.1',
  'MetaGenerator': '',
  'PoweredBy': '',
  'Server': ''},
 {'Domain': 'http://www.example2.com',
  'Email': '',
  'IP': '2.2.2.2',
  'MetaGenerator': '',
  'PoweredBy': 'PHP/5.5.9-1ubuntu4.20',
  'Server': 'Apache'},
 {'Domain': 'http://www.example3.com',
  'Email': 'sales@example3.com',
  'IP': '2.2.2.2',
  'MetaGenerator': 'Easy Digital Downloads v2.4.9',
  'PoweredBy': 'PHP/5.5.9-1ubuntu4.20',
  'Server': 'Apache'},
 {'Domain': 'http://www.example3.com',
  'Email': 'sales@example3.com',
  'IP': '2.2.2.2',
  'MetaGenerator': 'Powered by Visual Composer - drag and drop page builder for WordPress.',
  'PoweredBy': 'PHP/5.5.9-1ubuntu4.20',
  'Server': 'Apache'},
 {'Domain': 'http://www.example3.com',
  'Email': 'info@example3.com',
  'IP': '2.2.2.2',
  'MetaGenerator': 'Easy Digital Downloads v2.4.9',
  'PoweredBy': 'PHP/5.5.9-1ubuntu4.20',
  'Server': 'Apache'},
 {'Domain': 'http://www.example3.com',
  'Email': 'info@example3.com',
  'IP': '2.2.2.2',
  'MetaGenerator': 'Powered by Visual Composer - drag and drop page builder for WordPress.',
  'PoweredBy': 'PHP/5.5.9-1ubuntu4.20',
  'Server': 'Apache'}]

擁有以下Python代碼:

import csv
import pprint
import json

with open("results.csv", 'r') as csvfile:
    reader = csv.DictReader(csvfile, delimiter=',')
    out=[]
    d=dict()
    for row in reader:
        if ';' in row['Email']:
          val = row['Email'].split(';')
          for v in val:
            d['Email']=v
            out.append(d)    
        if ';' in row['MetaGenerator']:
          val = row['MetaGenerator'].split(';')
          for v in val:
            d['MetaGenerator']=v
            out.append(d)
        else:
          d=row
          out.append(d) 


pprint.pprint(out)

但是它不能正常工作。

如何實現我的目標? 偽代碼也可以。 順序並不重要。 我應該使用什么模塊?

謝謝,

試試這個(檢查itertools文檔):

import csv
import pprint
import json
import itertools

out=[]
with open("results.csv", 'r') as csvfile:
    reader = csv.DictReader(csvfile, delimiter=',')
    for row in reader:

        Domains = row['Domain'].split(";")
        Ips = row['IP'].split(";")
        Servers = row['Server'].split(";")
        Emails = row['Email'].split(";")
        MetaGenerators = row['MetaGenerator'].split(";")
        PoweredBy = row['PoweredBy'].split(";")

        for comb in itertools.product(Domains, Ips, Servers, Emails, MetaGenerators, PoweredBy):
            (cDomain, cIp, cServer, cEmail, cMeta, cPowered) = comb

            out.append({
                    'Domain': cDomain,
                    'IP': cIp,
                    'Server': cServer,
                    'Email': cEmail,
                    'MeraGenerator': cMeta,
                    'PoweredBy': cPowered
                })

pprint.pprint(out)

請檢查以下與csv字段隔離的可讀性較差但更智能的解決方案:

out=[]
with open("results.csv", 'r') as csvfile:
    reader = csv.DictReader(csvfile, delimiter=',')
    headers = reader.fieldnames

    for row in reader:
        fields = [value.split(";") for key, value in row.iteritems()]
        out += [{headers[key]: value for key, value in enumerate(comb)} for comb in itertools.product(*fields)]

pprint.pprint(out)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM