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'
我读到一种选择,它是在排序之前将数字转换为字符串,然后在写入文件之前将其转换回数字,但实际上并没有工具来执行此操作。
有人知道如何把它记下来吗?
您需要强制转换为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它是阅读器对象而不是列表,您必须调用list该reader对象,但也可以只使用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)
这不是将数据放入一列,,而是界定每一列的内容,即用逗号分隔的值。