首页 > 解决方案 > Python:按间隔对csv文件进行排序

问题描述

我有一个该类型的 csv 文件:

45,85,{20, 58, 12, ...},]-inf;503]  
478,10,{5, 16, 87, ...},]1137;1212]    
etc.

我需要按最后一列对文件进行排序,这意味着括号之间的内容。这些备份之间的数字是一天中的分钟数,24 小时分为 7 个分钟间隔,从]-inf;503] 到 ]1212;+inf]。

我以为我做到了,但是当我查看文件时,它是错误的。
这是我到目前为止得到的:

data = csv.reader(open('Document.txt'))

sortedlist = sorted(data, key=operator.itemgetter(6))

with open('sorted1.txt', 'w') as f:
    fieldnames1=['0','1','2','3','4','5','6']
    writing=csv.DictWriter(f, fieldnames=fieldnames1)
    for line in sortedlist:
        writing.writerow({'0': line[0] ,'1': line[1] ,'2': line[2] ,'3': line[3] ,'4': line[4] ,'5': line[5] ,'6': line[6]})


f.close()

输出结果应该是已排序的文档,没有标题。但是我的文件没有排序,我的意思是每个时间间隔都在一起意味着 ]-inf;503] 都在一起等等,但没有正确排序。此外,我的输出文件中的每一行之间都有一个空行,我需要这些空行消失。
我哪里做错了?

标签: pythoncsv

解决方案


Python 不够聪明,无法猜测括号之间的东西是一个范围。对于解释器,它只是一个字符串,它会按字典顺序对其进行排序。

所以你需要一个专用的键函数来按它们的第一个值对你的范围进行排序,字符串'-inf'小于任何数字。它可能是:

def keyfunc(row):
    start = row[6]
    ix = start.index(';')      # stop before the semicolon
    start = start[1:ix]        # and start after the initial bracket
    return -1 if start == '-inf' else int(start)

对于写入部分,文档声明文件应该用 . 打开newline='',而您已经过度考虑了整个事情。它可能很简单:

data = csv.reader(open('Document.txt'))

sortedlist = sorted(data, key=keyfunc)

with open('sorted1.txt', 'w', newline='') as f:
    writing=csv.writer(f)
    writing.writerows(sortedlist)

推荐阅读