python - 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] 都在一起等等,但没有正确排序。此外,我的输出文件中的每一行之间都有一个空行,我需要这些空行消失。
我哪里做错了?
解决方案
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)
推荐阅读
- html - 列内的文本溢出。如何强制文本始终水平扩展并与列宽内联
- reactjs - 我应该在 React 中使用哪种类型的组件:功能组件或类基础组件?
- javascript - Google maps API Autocomplete:仅输出特定州的城市
- c# - 返回 IAsyncEnumerable
和来自 Asp.Net 核心控制器的 NotFound - python - 如何在 Discord.py 中发送消息并从中收集反应
- c# - 错误“需要对象引用”是什么意思?
- javascript - 如何将 Javascript 转换为 jQuery
- ios - 从 HealthKit 获取 Apple Watch 应用程序的心率和步行距离以及计步器
- android - 在回调 viewpager 片段后按时收到此错误您必须先在孩子的父母上调用 removeView()
- c++ - 为什么我的 constexpr 对象不在我的函数中?