按数值对csv排序

时间:2015-03-30 00:23:14

标签: python sorting csv

我正在寻找并阅读与我类似的先前问题和答案,但没有找到一个很好的解决方案。

我有一个包含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'对象没有属性'排序'

我读到了一个选项,即在排序之前将数字转换为字符串,然后在写入文件之前将它们转换回数字,但不是真的有工具来完成它。

任何人都知道如何让这个失败?

1 个答案:

答案 0 :(得分:4)

你需要转换为int:

srt= sorted(csv1, key=lambda x: int(x[0]))

您正在排序100 < 12

的字符串

sort=csv1.sort(key=lambda row: row[0], reverse=True)会给您一个错误,因为csv1是一个读者对象而不是列表,您必须在list对象上调用reader,但您可能也只是使用已排序。

你可以看到使用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按char进行char,具有更大值的第一个char将被视为更高的值,因此在第一个排序的输出100中被认为是&lt; 12因为2> 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

这不是将数据放入一列,,是划分每列的内容,即逗号分隔值。