我正在寻找并阅读与我类似的先前问题和答案,但没有找到一个很好的解决方案。
我有一个包含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'对象没有属性'排序'
我读到了一个选项,即在排序之前将数字转换为字符串,然后在写入文件之前将它们转换回数字,但不是真的有工具来完成它。
任何人都知道如何让这个失败?
答案 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
这不是将数据放入一列,,
是划分每列的内容,即逗号分隔值。