2015-03-30 3 views
2

Я искал и читал предыдущие вопросы и ответы, похожие на мои, но не нашел подходящего решения для моего дела.Сортировка csv по числовым значениям

У меня есть файл csv с 2 столбцами. Один из них - числовые значения (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

Можете ли вы привести пример файла или его фиктивную версию. – Marcin

+0

Не удалось загрузить и отредактировать мое сообщение (не хватает репутации). Но вот ссылка: http: //s12.postimg.org/zfbjsa6ul/Screenshot_2015_03_28_at_17_11_05.png – HBS

ответ

4

Вы должны бросить в целое:

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

Вы сортировки строк, где 100 < 12

sort=csv1.sort(key=lambda row: row[0], reverse=True) дает ошибку, потому что csv1 является читателем объект не список, вы должны вызвать list на объект reader, но вы можете просто использовать отсортированные.

Вы можете увидеть, используя Интс дает совсем другой вывод:

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'] 

Сортировка как строки питона идет голец по полукокса, первый символ с большим значением будет считаться более высокое значение, так как в первом отсортирован 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]))) 

выход будет:

value, image 
50, bottle.jpg 
75, broomstick.jpg 
175, book.jpg 
100, car.jpg 

Который не ставит данные в один столбец, то , является то, что каждый столбец разграничивает, т.е. запятыми значения.

+0

Спасибо, Padraic. Я попытался запустить его, но получил следующее: «ValueError: недействительный литерал для int(): с базой 10: 50,« book »- я должен упомянуть, что 50 является одним из моих значений, а книга - одним из изображений. Должен ли я помещать их обратно в номера перед написанием csv? – HBS

+0

вы уверены, '' 'является не фактическим разделителем? Попробуйте' csv1 = csv.reader (sample) ' –

+0

Отлично, сортировка отлично работает сейчас! файл имеет как значение, так и изображение в одном столбце, объединенное запятой. Кроме того, имя изображения (сразу после запятой) выглядит так: «image.jpg.» (то есть с добавлением «_»). из двух столбцов, у меня есть это в одной колонке 50. «bottle.jpg» – HBS

Смежные вопросы