Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 14, 2017 12:55:21

whoami217
Зарегистрирован: 2017-09-09
Сообщения: 22
Репутация: +  0  -
Профиль   Отправить e-mail  

Поиск в тексте, запись - проблема с логикой выборки и остановки

Доброго времени суток!
Подскажите как на 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()
в последнем коде отсутствует адекватная остановка цикла.

Офлайн

#2 Сен. 14, 2017 17:55:36

vic57
Зарегистрирован: 2015-07-07
Сообщения: 913
Репутация: +  127  -
Профиль  

Поиск в тексте, запись - проблема с логикой выборки и остановки

почитайте про слайсы (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)

Офлайн

#3 Сен. 14, 2017 18:19:39

Vintets
Зарегистрирован: 2016-07-05
Сообщения: 41
Репутация: +  6  -
Профиль   Отправить e-mail  

Поиск в тексте, запись - проблема с логикой выборки и остановки

 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)

Офлайн

#4 Сен. 15, 2017 10:52:32

whoami217
Зарегистрирован: 2017-09-09
Сообщения: 22
Репутация: +  0  -
Профиль   Отправить e-mail  

Поиск в тексте, запись - проблема с логикой выборки и остановки

Vintets объясните, пожалуйста. Есть строчка f_out = ‘step_%d.xls’ % name. В этой строчке присутствует второй %. Что он выполняет? Насколько я знаю, то % выполняется, когда левый операнд делит правый и возвращает остаток. И ещё если необходимо вывести целую часть числа.
Также в Вашем коде присутствует:

 if name == 0:
    f.close()
Для чего закрывать файл? Если закрыть файл, то его нужно будет снова открывать.

Отредактировано whoami217 (Сен. 15, 2017 11:32:28)

Офлайн

#5 Сен. 15, 2017 15:18:53

Vintets
Зарегистрирован: 2016-07-05
Сообщения: 41
Репутация: +  6  -
Профиль   Отправить e-mail  

Поиск в тексте, запись - проблема с логикой выборки и остановки

Там ошибся,

  if name != 0:
Закрываем прошлый открытый (если сейчас файл не первый).

На самом деле первый вариант не очень хороший. В нём входной файл должен быть корректен и содержать хотя-бы один блок с 1 во втором столбце. Иначе будет ошибка. Лучше другие варианты.

% здесь не деление, это форматирование строк такое. Подставляет значения в строку.
'Имя %s. Возраст: %d лет' % ('Vasya', 5)
заменяемые %s - строки, %d - целые числа, %f' - c плавающей точкой.
Тут нужно просто взять и почитать про это, там еще много чего есть.

Для подстановки можно использовать метод .format() он считается более “правильным”.

Офлайн

#6 Сен. 16, 2017 12:28:15

whoami217
Зарегистрирован: 2017-09-09
Сообщения: 22
Репутация: +  0  -
Профиль   Отправить e-mail  

Поиск в тексте, запись - проблема с логикой выборки и остановки

Vintets, благодарю за объяснение. Действительно, не всегда подходит первый вариант. А по поводу форматирования строк я вспомнила тему.

Офлайн

#7 Сен. 18, 2017 15:06:49

whoami217
Зарегистрирован: 2017-09-09
Сообщения: 22
Репутация: +  0  -
Профиль   Отправить e-mail  

Поиск в тексте, запись - проблема с логикой выборки и остановки

Vintets
можно ли использовать файл .xls, а на выходе получить .csv, но с тем, что у вас в коде выполняется?

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version