Python 解析CSV文件并修改列

Python 解析CSV文件并修改列,python,csv,Python,Csv,我想以特定的方式更改CSV文件。这是我的示例CSV文件: name,time,Operations Cassandra,2015-10-06T15:07:22.333662984Z,INSERT Cassandra,2015-10-06T15:07:24.334536781Z,INSERT Cassandra,2015-10-06T15:07:27.339662984Z,READ Cassandra,2015-10-06T15:07:28.344493608Z,READ Cassandra,20

我想以特定的方式更改CSV文件。这是我的示例CSV文件:

name,time,Operations
Cassandra,2015-10-06T15:07:22.333662984Z,INSERT
Cassandra,2015-10-06T15:07:24.334536781Z,INSERT
Cassandra,2015-10-06T15:07:27.339662984Z,READ
Cassandra,2015-10-06T15:07:28.344493608Z,READ
Cassandra,2015-10-06T15:07:28.345221189Z,READ
Cassandra,2015-10-06T15:07:29.345623750Z,READ
Cassandra,2015-10-06T15:07:31.352725607Z,UPDATE
Cassandra,2015-10-06T15:07:33.360272493Z,UPDATE
Cassandra,2015-10-06T15:07:38.366408708Z,UPDATE
我知道如何使用python解析器读取CSV文件,但我对这方面完全是个初学者。我需要得到这样一个输出:

start_time,end_time,operation
2015-10-06T15:07:22.333662984Z,2015-10-06T15:07:24.334536781Z,INSERT    
2015-10-06T15:07:27.339662984Z,2015-10-06T15:07:29.345623750Z,READ
2015-10-06T15:07:31.352725607Z,2015-10-06T15:07:38.366408708Z,UPDATE
评论: 开始时间是特定查询(插入/读取、更新)开始时给出的时间戳,因此结束时间是查询的完成时间


谢谢。

从您的示例中可以看出,您可以(大概)保证“操作”列中某一类型的第一个条目和同一类型的最后一个条目是开始和停止时间。如果你不能保证这一点,那么它就稍微复杂一点,但让我们假设你不能——为了更加健壮

我们可以假设CSV中表示的数据是完整的。如果您缺少特定操作的条目,我们几乎无能为力。我们还希望读取时间戳,这可以使用
dateutil.parser
模块来完成

因此,我们可以先建立一个简短的字典来跟踪我们的值,然后建立一个函数来填充字典,它一次只接受一行

import dateutil.parser
ops=dict()
def更新操作(操作信息,世界其他地区):
#首先以可用的格式获取时间戳和操作名
timestamp=dateutil.parser.parse(第[1]行)
op_name=行[2]
##现在填充或更新字典
如果opsdict中没有op_名称:
#使用操作的时间戳设置新的dict条目。
#因为我们不知道开始时间和结束时间
#然而,就目前而言,这两种观点都是正确的。
opsdict[op_name]={“开始时间”:时间戳,
“结束时间”:timetstamp}
其他:
#现在根据每个开始时间计算当前时间戳
#和结束时间值。根据需要进行更新。
如果opsdict[op_name]['start_time']>时间戳:
opsdict[op_名称]['start_time']=时间戳
如果opsdict[op_name]['end_time']<时间戳:
opsdict[op_name]['end_time']=时间戳
现在我们有了一个进行排序的功能,运行CSV文件读取器并填充
ops
。完成后,我们可以使用字典中的内容生成一个新的CSV文件

import csv

cr = csv.reader(open('/path/to/your/file.csv'))
cr_head = cr.next()    # throw away the first row

for row in cr:
    update_ops(ops, row)

# Now write a new csv file – csv.writer is your friend :)
with open('new_operation_times.csv', 'w') as newcsv:
    cw = csv.writer(newcsv)

    # first write your header. csv.writer accepts lists for each row.
    header = 'start_time,end_time,operation'.split(',')
    cw.writerow(header)

    # now write out your dict values. You may want them sorted, 
    # but how to do that has been answered elsewhere on SE.
    for opname, timesdict in ops.items():
        row = [ opname, timesdict['start_time'], timesdict['end_time'] ]
        cw.writerow(row)

你完了!我已经尽可能详细地阐述了这一点,以便弄清楚到底发生了什么。您可能可以将很多内容压缩为更少、更聪明的步骤(例如从一个csv读取并直接写出)。但是,如果您遵循KISS原则,那么以后阅读本文并再次从中学习会更容易。

请看一看python文档:我刚刚阅读了有关python parser for csv的内容。我对python完全是新手,我只能从我的csv文件中读取。@Araz它们应该都在同一个文件中。传统上(也是很好的做法),您应该将两行
import
放在一起,放在顶部ops'在上一节中定义,带有
ops=dict()
。它在下面的部分被调用,
用于cr:update\u ops(ops,row)
。噢,我真傻。你明白错误告诉你的是什么吗?如果您想学习Python,请遵循回溯。第一个错误是它在脚本中的起始位置(以及脚本中的行号);最后一个错误是告诉您,
dateutil.parser
模块的方法,
parse()
,正在阻塞其输入。我犯了一个错误,您可以看到:
csv.reader()
对象只是一个迭代器,它从您提供给它的csv文件的第一行开始逐行遍历文件,然后从那里返回每行的列表。
update\u ops
函数对行中的第二项运行
dateutil.parser.parse()
方法,该项应该是时间戳。但是文件的第一行与Cassandra不同,2015-10-06T15:07:22.333662984Z,INSERT–它是
名称、时间、操作
。因此,在脚本中添加一行额外内容以丢弃第一行。由于csv.reader()只是一个迭代器,因此只要实例化对象,就可以插入一行,如
cr\u head=cr.next()
——这应该是可行的。(我将编辑)另一个错误-常见;我应该循环使用ops.items(),而不是单独使用ops。