Форум сайта python.su
0
У меня есть файл с данными.
По типу:
25,37,45,54,67
33,67,43,78,50
12,32,72,96,45
…
Много строк и 5 столбцов.
Задача, взять 3-й элемент каждой строки 10 строк, записать в строку через запятую в новый файл. Отступить один шаг от первой строки, взять следующий 10 строк и записать во вторую строку…
Как я делаю, загружаю исходный файл numpy.loadtxt(1.txt)
И дальше танцы с бабнами…
Можете посоветовать, как это сделать профессионально и грамотно?
Офлайн
22
Как я понимаю, везде, где написано число 10, надо читать “десяток”…
len_line = 10 arr = numpy.loadtxt("1.txt", delimiter=",", dtype=int) new_file = open("2.txt", "w") new_list = [] for ind in range(arr.shape[0]): new_list.append(str(arr[ind,2])) if (ind+1) % len_line == 0: new_file.write(','.join(new_list)+'\n') new_list = [] if new_list: new_file.write(','.join(new_list)) new_file.close()
Отредактировано Striver (Сен. 27, 2019 13:45:32)
Офлайн
0
Я тоже через список делал… мне казалось как-то много кода, честно сказать у меня еще больше кода)))
Но в любом случае огромное спасибо за ответ
Офлайн
22
мне казалось как-то много кодаЕсли точно известно, что количество строк делится на 10, т.е. последняя строка результата будет длины 10, как и остальные, то можно наворотить так:
arr = numpy.loadtxt("1.txt", delimiter=",", dtype=int) arr2=arr[:,2] arr3=arr2.reshape(len(arr2)/10,10) numpy.savetxt("2.txt", arr3, delimiter=",")
Офлайн
0
StriverТакое вряд ли… но в чем проблема сделать arr2 = len(arr)//10 ?
Если точно известно, что количество строк делится на 10
Отредактировано KH93b (Сен. 27, 2019 14:33:53)
Офлайн
22
но в чем проблема сделать arr2 = len(arr)//10 ?Во-первых, да, нужно ставить именно //, иначе размерность нецелая будет. Тут мой косяк.
Можно отсечь кусок с конца, это не страшноА вот это только тому, кто ставит задание, известно, что можно отсечь, а что нельзя. Исходя из того, что ты написал в первом сообщении, требуется использовать все числа. А так получается что-то вроде “мне тут часть данных мешается сделать красиво, выкину их…”. Вряд-ли это “профессионально и грамотно” :)
Офлайн
0
StriverА если данные float? Тут ошибка у меня вылезла. В примере, я int указал, сорри
arr3=arr2.reshape(len(arr2)/10,10)
Отредактировано KH93b (Сен. 27, 2019 21:12:58)
Офлайн
0
Вот еще какой момент. В твоем коде мы берем 10 строк, затем следующие 10. А у меня получается - берем 10 строк
[0:10]
[1:11]
Отредактировано KH93b (Сен. 27, 2019 21:43:33)
Офлайн
0
Я вот не могу понять, как в цикле пройти 10 шагов, а потом вернуться на шаг +1 от предыдущего начального
Вот так сделал, вроде то что надо. Конечно код с решейпом выглядит заманчиво, но там я навряд ли так сделаю
for ind in range(arr.shape[0]-wn): new_list.append(str(arr[ind:wn+ind,7])) new_file.write(';'.join(new_list)+'\n') new_list = []
Отредактировано KH93b (Сен. 27, 2019 22:02:35)
Офлайн
22
А если данные float? Тут ошибка у меня вылезла. В примере, я int указал, сорритам при загрузке в параметре dtype указывается тип данных:
TypeError: ‘float’ object cannot be interpreted as an integer
arr = numpy.loadtxt("1.txt", delimiter=",", dtype=int)
Офлайн