按数值排序 csv
Posted
技术标签:
【中文标题】按数值排序 csv【英文标题】:Sort csv by numerical values 【发布时间】:2015-06-02 21:39:35 【问题描述】:我正在查看和阅读与我类似的以前的问题和答案,但没有找到适合我的案例的好的解决方案。
我有一个包含 2 列的 csv 文件。一种是数值(100、40、350等),另一种是图片标签名列表(即computer.jpg)。
我要做的是按第一列(即值)以升序方式对文件进行排序。这也意味着我希望这对值(图像名称)随之移动。
这是我目前所拥有的:
import csv
import operator
sample=open('random.csv', "r")
csv1=csv.reader(sample, delimiter='.')
header=next(csv1, None)
sort= sorted(csv1, key=operator.itemgetter(0))
with open('randomized.csv', "wb") as f:
csv_writer=csv.writer(f, delimiter='.')
if header:
csv_writer.writerow(header)
csv_writer.writerows(sort)
然而,结果排序列表是这样的:100、175、20、250、3。
我尝试了一些其他代码,例如:
sort=csv1.sort(key=lambda row: row[0], reverse=True)
但我收到一个错误回复:AttributeError: '_csv.reader' object has no attribute 'sort'
我读到了一种选择,即在排序之前将数字转换为字符串,然后在写入文件之前将它们转换回数字,但实际上并没有工具来做到这一点。
有人知道怎么弄这个吗?
【问题讨论】:
您能否提供文件示例或其虚拟版本。 无法上传和编辑我的帖子(没有足够的声誉)。但这里有一个链接:s12.postimg.org/zfbjsa6ul/Screenshot_2015_03_28_at_17_11_05.png 【参考方案1】:你需要转换为 int:
srt= sorted(csv1, key=lambda x: int(x[0]))
您正在对字符串进行排序,其中100 < 12
sort=csv1.sort(key=lambda row: row[0], reverse=True)
给你一个错误,因为csv1
是一个阅读器对象而不是一个列表,你必须在reader
对象上调用list
,但你也可以只使用排序。
你可以看到使用 ints 给出了非常不同的输出:
In [46]: l = ["100","2","12","200"]
In [47]: sorted(l)
Out[47]: ['100', '12', '2', '200']
In [48]: sorted(l,key=lambda x: int(x))
Out[48]: ['2', '12', '100', '200']
按字符串排序 python 逐个字符地进行排序,具有较大值的第一个字符将被视为较高值,因此在第一个排序输出中,100 被视为 0。
把它们放在一起:
import csv
with open('random.csv') as sample, open('randomized.csv', "w") as out:
csv1=csv.reader(sample)
header = next(csv1, None)
csv_writer = csv.writer(out)
if header:
csv_writer.writerow(header)
csv_writer.writerows(sorted(csv1, key=lambda x:int(x[0])))
输出将是:
value, image
50, bottle.jpg
75, broomstick.jpg
175, book.jpg
100, car.jpg
这不是将数据放入一列,,
是每一列的分隔符,即逗号分隔值。
【讨论】:
谢谢,帕德莱克。我试图运行它但得到了这个:“ValueError:int()的无效文字:以10为底:50,'book' - 我应该提到50是我的价值观之一,而书是图像之一。我应该在写 csv 之前把它们放回数字吗? 您确定,
不是实际的分隔符吗?试试csv1=csv.reader(sample)
太好了,排序现在完美了!但是,新文件在一列中同时包含值和图像,用逗号连接。此外,图像名称(逗号后)是这样的:“image.jpg”。 (即,添加“_”)。因此,从两个不同的列中,我在一个列中有这个 50."bottle.jpg"
等等,你想要剩下的文件吗?是这样的:s12.postimg.org/zfbjsa6ul/Screenshot_2015_03_28_at_17_11_05.png
@HBS,即不在一列中,,
分隔列以上是关于按数值排序 csv的主要内容,如果未能解决你的问题,请参考以下文章