Форум сайта python.su
0
Доброго времени суток!
Подскажите как на python3 сделать скрипт задача которого в следующем:
Есть xls файл, который состоит из трёх колонок. Во второй колонке содержатся числа, которые идут от 1 до N, затем снова от 1 до M и т.д., и повторяется это количество раз n, пока не закончатся все строки в файле.
Создаем первый файл для записи, в который записываем все три колонки, где вторая колонка содержит от 1 до N, далее создаем второй файл для записи, в который записываем все три колонки, где вторая колонка содержит от 1 до M, и т.д. Создаем количество файлов для записи равное n.
Текущий файл:
t j No
1 1 3
2 2 7
3 3 9
4 4 12
5 5 11
6 6 9
7 7 4
8 8 9
9 9 10
10 10 10
11 11 7
12 12 7
13 13 4
14 14 12
15 15 5
16 16 8
17 1 0
18 2 0
19 3 0
20 4 0
21 1 0
22 2 0
23 3 0
Должно выглядеть так в отдельных файлах:
В первый файл записывается:
t j No
1 1 3
2 2 7
3 3 9
4 4 12
5 5 11
6 6 9
7 7 4
8 8 9
9 9 10
10 10 10
11 11 7
12 12 7
13 13 4
14 14 12
15 15 5
16 16 8
Во второй файл записывается:
t j No
17 1 0
18 2 0
19 3 0
20 4 0
В третий файл записывается:
t j No
21 1 0
22 2 0
23 3 0
Надеюсь, что максимально подробно объяснила.
Заранее всем спасибо!
Код для записи в первый файл:
with open('raspak.xls') as f: lines = f.readlines() name = 1 name = str(name) f_out = 'step_' + name + '.xls' f = open(f_out, 'w') name = int(name) name = name + 1 title = [ i.strip() for i in lines[0].split('\t') ] print(title) indexes = [] for i in title: indexes.append(title.index(i)) print(indexes) for line in lines[:2]: l = [i.strip() for i in line.split('\t')] tmp = [] for i in l: tmp.append(i) print(tmp) output_data = '\t'.join(tmp) f.write(output_data + '\n') for line in lines[2:]: l = [ i.strip() for i in line.split('\t') ] #print(l) tmp1 =[] if l[1] != '1': for i in indexes: tmp1.append(l[i]) print(tmp1) else: break f.write('\t'.join(tmp1) + '\n') f.close()
with open('raspak.xls') as f: lines = f.readlines() d = len(lines) print(d) name = 1 while True: name = str(name) f_out = 'step_' + name + '.xls' f = open(f_out, 'w') name = int(name) name = name + 1 title = [ i.strip() for i in lines[0].split('\t') ] print(title) indexes = [] for i in title: indexes.append(title.index(i)) print(indexes) for line in lines[:2]: l = [i.strip() for i in line.split('\t')] tmp = [] for i in l: tmp.append(i) print(tmp) output_data = '\t'.join(tmp) f.write(output_data + '\n') for line in lines[2:]: l = [ i.strip() for i in line.split('\t') ] print(l) tmp1 =[] if l[1] == '1': continue else: for i in indexes: tmp1.append(l[i]) #print(tmp1) #else: #break f.write('\t'.join(tmp1) + '\n') if not lines: break f.close()
Офлайн
почитайте про слайсы (slice)
doc = ''' t j No 1 1 3 2 2 7 3 3 9 4 4 12 5 5 11 6 6 9 7 7 4 8 8 9 9 9 10 10 10 10 11 11 7 12 12 7 13 13 4 14 14 12 15 15 5 16 16 8 17 1 0 18 2 0 19 3 0 20 4 0 21 1 0 22 2 0 23 3 0 ''' lines = [i for i in doc.split('\n') if i] headers = lines.pop(0) indexes = [] for i in range(len(lines)): tmp = lines[i].split() if tmp[1] == '1': indexes.append(i) indexes.append(len(lines)) count = 1 for i in range(1,len(indexes)): begin = indexes[i-1] end = indexes[i] print('count:'+str(count)) count += 1 print(headers) for i in lines[begin:end]: print (i)
Отредактировано vic57 (Сен. 14, 2017 18:01:35)
Офлайн
6
with open('raspak.xls') as f: lines = f.readlines() print('len ', len(lines)) title = lines[0] name = 0 for line in lines[1:]: if line.split('\t')[1] == '1': if name != 0: f.close() name += 1 f_out = 'step_%d.xls' % name f = open(f_out, 'w') f.write(title) f.write(line) f.close()
with open('raspak.xls') as f: lines = f.readlines() print('len ', len(lines)) title = lines[0] data = [title] name = 0 for line in lines[1:]: if line.split('\t')[1] == '1' and len(data) > 1: name += 1 with open('step_%d.xls' % name, 'w') as f: f.write(''.join(data)) data = [title] data.append(line) if len(data) > 1: with open('step_%d.xls' % (name+1), 'w') as f: f.write(''.join(data))
with open('raspak.xls') as f: lines = f.readlines() print('len ', len(lines)) title = lines[0] alldata = [] data = [] for line in lines[1:]: if line.split('\t')[1] == '1': if data: alldata.append([title] + data) data = [] data.append(line) if data: alldata.append([title] + data) for n, d in enumerate(alldata): with open('step_%d.xls' % (n+1), 'w') as f: f.write(''.join(d))
Отредактировано Vintets (Сен. 15, 2017 15:06:04)
Офлайн
0
Vintets объясните, пожалуйста. Есть строчка f_out = ‘step_%d.xls’ % name. В этой строчке присутствует второй %. Что он выполняет? Насколько я знаю, то % выполняется, когда левый операнд делит правый и возвращает остаток. И ещё если необходимо вывести целую часть числа.
Также в Вашем коде присутствует:
if name == 0: f.close()
Отредактировано whoami217 (Сен. 15, 2017 11:32:28)
Офлайн
6
Там ошибся,
if name != 0:
Офлайн
0
Vintets, благодарю за объяснение. Действительно, не всегда подходит первый вариант. А по поводу форматирования строк я вспомнила тему.
Офлайн
0
Vintets
можно ли использовать файл .xls, а на выходе получить .csv, но с тем, что у вас в коде выполняется?
Офлайн