【问题标题】:Adding column headers to csv file using python, reading json使用python将列标题添加到csv文件,读取json
【发布时间】:2016-10-28 13:15:50
【问题描述】:

所以我有一个程序可以读取 json,将其展平并转储 csv:

import json
import unicodecsv as csv
import sys
import glob
import os
from flatten_json import flatten_json

def createcolumnheadings(cols):
    #create column headings
    columns = cols.keys()
    columns = list( set( columns ) )
    return columns

doOnce=True

path=os.chdir(sys.argv[1])

for f in glob.glob("smallR.txt"):
    fName=os.path.splitext(f)[0]
    out_file= open( 'csv/' + fName+'.csv', 'wb' )
    csv_w = csv.writer( out_file, delimiter="\t", encoding='utf-8'  )

    with open(f, 'r') as handle:
        for line in handle:   
            data = json.loads(line)        
            flatdata =flatten_json(data)             
            if doOnce:
                columns=createcolumnheadings(flatdata) 
                columns.insert(0,'racism')
                csv_w.writerow( columns)                
                doOnce=False
            flatdata['racism']= 0
            csv_w.writerow(flatdata.get(x, u'') for x in columns)

这工作正常,有一个问题。 我的程序只是从 smallR.txt 中的第一行获取列标题(加上它添加了一个“种族主义”列)。

后面的一些数据(smallR.txt here)有不同的列。这会导致输出不太正确,请参阅 small.csv here

是否有一种简单的方法可以调整我的程序以处理在后面的行中发现的新列标题?

【问题讨论】:

    标签: python json csv


    【解决方案1】:

    在这种情况下,您需要先扫描整个文件,以获取所有可能的列:

    with open(f, 'r') as handle:
        data = [json.loads(line) for line in handle]
    
    columns = ['racism'] + list({k for entry in data for k in entry.keys()})
    
    csv_w.writerow(columns)
    for entry in entries:
        csv_w.writerow(entry.get(c, '') for c in columns)
    

    将所有数据加载到内存中。如果这对您来说不可接受,您可能会读取该文件两次:一次获取列,另一次读取和写入:

    with open(f, 'r') as handle:
        columns = ['racism'] + list({k for line in handle for k in json.load(line).keys()})
    csv_w.write(columns)
    
    with open(f, 'r') as handle:
        for line in handle:
            entry = json.loads(line)
            csv_w.write(entry.get(c, '') for c in columns)
    

    flatten_json 函数定义丢失,所以我只能猜测它的作用。

    【讨论】:

    • 谢谢哈维尔,文件很大,所以我会尝试你的第二种方法。 Flatten_json 是来自 here 的导入
    猜你喜欢
    • 2012-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-02
    • 2019-10-14
    • 2021-11-26
    • 2014-09-17
    • 1970-01-01
    相关资源
    最近更新 更多