按数值对csv排序

HBS*_*HBS 2 python csv sorting

我一直在寻找和阅读以前与我类似的问题和答案,但没有找到解决我案件的好方法。

我有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)
Run Code Online (Sandbox Code Playgroud)

但是,结果排序列表如下:100、175、20、250、3。

我尝试了其他一些代码,例如:

sort=csv1.sort(key=lambda row: row[0], reverse=True)
Run Code Online (Sandbox Code Playgroud)

但是我收到一个错误消息:AttributeError:'_csv.reader'对象没有属性'sort'

我读到一种选择,它是在排序之前将数字转换为字符串,然后在写入文件之前将其转换回数字,但实际上并没有工具来执行此操作。

有人知道如何把它记下来吗?

Pad*_*ham 5

您需要强制转换为int:

srt= sorted(csv1, key=lambda x: int(x[0]))
Run Code Online (Sandbox Code Playgroud)

您正在对字符串进行排序 100 < 12

sort=csv1.sort(key=lambda row: row[0], reverse=True)给您一个错误,因为csv1它是阅读器对象而不是列表,您必须调用listreader对象,但也可以只使用sorted。

您可以看到使用int给出了非常不同的输出:

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']
Run Code Online (Sandbox Code Playgroud)

当python按字符串进行排序时,第一个具有较大值的char将被认为是一个较高的值,因此在第一个已排序的输出100中被视为<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])))
Run Code Online (Sandbox Code Playgroud)

输出将是:

value, image
50, bottle.jpg
75, broomstick.jpg
175, book.jpg
100, car.jpg
Run Code Online (Sandbox Code Playgroud)

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