按数值排序 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的主要内容,如果未能解决你的问题,请参考以下文章

python读取文件csv,先按第4列排序,再按第5列的数值排序

如何按数值对 json 进行排序?

Bash:按前 4 列对 csv 文件进行排序

mysql按照字符串类型的数值按数值进行排序

插入数值,并按有序排序

如何按数值对包含 NSDictionary 的 NSMutableArray 进行排序?