【问题标题】:write data in to a csv according to headers names, which indicate occurrences of items根据标题名称将数据写入 csv,这表明项目的出现
【发布时间】:2017-06-12 19:01:20
【问题描述】:

我需要使用标题将数据输入到 csv 中,如果标志在事件中可用,则输入一个值,否则将其归零。所需的输出是:

我目前得到:

这是我当前的代码,我想知道如何生成我想要的输出:

代码的输入是 counter1-4,如下所示:

OrderedDict([('flags=40', 3971), ('flags=10004', 6244), ('flags=10100', 236), ('flags=90002', 2), ('flags=80', 2009), ('flags=10080', 5421), ('flags=4', 2886), ('flags=100', 227), ('flags=80002', 58), ('flags=10040', 8990), ('flags=0', 5)])

OrderedDict([('flags=40', 16), ('flags=10004', 6244), ('flags=10100', 236), ('flags=90002', 2), ('flags=10080', 5421), ('flags=4', 16), ('flags=80002', 11), ('flags=10040', 8990), ('flags=0', 4), ('Total', 20940)])
OrderedDict([('flags=4', 1332), ('flags=40', 1839), ('flags=80002', 3), ('flags=100', 197), ('flags=80', 935), ('Total', 4306)])
OrderedDict([('Total', 0)])
OrderedDict([('flags=40', 2116), ('flags=80', 1074), ('flags=4', 1538), ('flags=100', 30), ('flags=80002', 44), ('flags=0', 1), ('Total', 4803)])

dat = 1        
with open(outputcsv,'wb') as outcsv:
    writer = csv.writer(outcsv,delimiter=',')
    appname = inputfile[:-3]
    writer.writerow(appname.split(','))
    for x in threads:
        writer.writerows([x.split(',')])
        #w.writeheader([x.split(',')])
        if dat == 1:
            w = csv.DictWriter(outcsv,counter1.keys())
            w.writeheader()
            w.writerow(counter1)
        elif dat == 2:
            w = csv.DictWriter(outcsv,counter2.keys())
            w.writeheader()
            w.writerow(counter2)
        elif dat == 3:
            w = csv.DictWriter(outcsv,counter3.keys())
            w.writeheader()
            w.writerow(counter3)
        elif dat == 4:
            w = csv.DictWriter(outcsv,counter4.keys())
            w.writeheader()
            w.writerow(counter4)
        dat = dat +1    
        writer.writerows('\n')

如何读取线程的代码:

 exampleFile = open('top_tasks.csv')
exampleReader = csv.reader(exampleFile)
exampleData = list(exampleReader)
thread1 = exampleData[11][0]
thread2 = exampleData[12][0]
thread3 = exampleData[13][0]
thread4 = exampleData[14][0]
threads = [thread1,thread2,thread3,thread4]

【问题讨论】:

  • 您应该创建一个Minimal, Complete, and Verifiable 示例。这使我们更容易为您提供帮助。特别是,您没有提供输入数据。
  • 我正在解析的文本是一个巨大的文件,我从中提取带有标志的事件
  • 是的,但MCVE 的意义在于,您可以获得一个代表问题的小示例,并允许我们和您进行测试。

标签: python csv dictionary header


【解决方案1】:

我认为这段代码符合你的要求:

from collections import OrderedDict
import csv

# build an OrderedDict of all keys
all_keys = OrderedDict()

# first column gets name of data set
all_keys[data_set_name] = data_set_name

# collect all of the known keys, and insert the thread name
for counter, thread in zip(counters, threads):
    all_keys.update(counter)
    counter[data_set_name] = thread

with open(outputcsv, 'wb') as outcsv:
    # using all known keys, create a csv writer
    w = csv.DictWriter(outcsv, fieldnames=all_keys.keys())

    # output the header and data rows
    w.writeheader()
    w.writerows(counters)

使用的数据:

outputcsv = 'output.csv'
counters = [
    OrderedDict(
        [('flags=40', 3971), ('flags=10004', 6244), ('flags=10100', 236),
         ('flags=90002', 2), ('flags=80', 2009), ('flags=10080', 5421),
         ('flags=4', 2886), ('flags=100', 227), ('flags=80002', 58),
         ('flags=10040', 8990), ('flags=0', 5)]),

    OrderedDict(
        [('flags=40', 16), ('flags=10004', 6244), ('flags=10100', 236),
         ('flags=90002', 2), ('flags=10080', 5421), ('flags=4', 16),
         ('flags=80002', 11), ('flags=10040', 8990), ('flags=0', 4),
         ('Total', 20940)]),
    OrderedDict([('flags=4', 1332), ('flags=40', 1839), ('flags=80002', 3),
                 ('flags=100', 197), ('flags=80', 935), ('Total', 4306)]),
    OrderedDict([('Total', 0)]),
    OrderedDict([('flags=40', 2116), ('flags=80', 1074), ('flags=4', 1538),
                 ('flags=100', 30), ('flags=80002', 44), ('flags=0', 1),
                 ('Total', 4803)]),
]

# code assumes thread names are in a list, make some sample names
threads = ['thread%d' % (i+1) for i in range(len(counters))]

# first column header if the name of the data set
data_set_name = 'CandyCrush 1'

【讨论】:

  • 是的,这确实按预期工作,但问题仍然存在,我需要在每一行中放置线程名称作为指示哪些线程具有哪些标志事件,你能帮忙吗
  • 是的,这很容易添加,但前提是 data is known 并与其他源数据相关联。
  • 线程名称随app变化,线程名称不一致
  • 是的,我相信线程名称会发生​​变化。但它需要程序知道,并与数据相关联。您提供的示例数据不包括线程名称。如果您可以显示线程名称如何与示例数据相关联,我可以轻松地编辑我的示例以包含它。
  • 线程正在从名为 top_tasks.csv 的文件中读取并分配给结合所有 4 个顶级线程的线程,请参阅上面编辑中的代码
猜你喜欢
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多