Форум сайта python.su
0
Задача следующая:
Есть файл в формате .txt. По определенным условиям необходимо строки раскидать по разным файлам. делаю так:
base=open('sms.txt').readlines() #список строк исходного файла minm=0 #количество строк, одного формата pl=0 #количество строк другого формата for line in base: if len(line)>30 and line[12:15]!="Пол": minm+=1 elif len(line)>30 and line[12:15]=="Пол": pl+=1 minus=int(input('Предлагается к отправке %s сообщений, из них %s с отрицательными балансами и %s с положительными. Сколько дней будем рассылать минусы? '%(pl+minm,minm,pl))) min_list=[open(str(q+1)+'.txt','w') for q in range(minus)] # список файлов, количество файлов=числу дней на рассылку, т.е. объекту minus a=[[]for q in range(minus)] #список из списков строк, которые будут записываться в файл, len(list((a))==minus if input('Каждый день одинаковое количество (да/нет)? ')=='да' or 'Да': #на данный момент выбирается только вариант "Да", поэтому другие варианты не рассматриваем evrdaymin=minm//minus #количество строк на каждый файл lastdaymin=minm-(minus-1)*evrdaymin #количество смс для последнего файла if evrdaymin==lastdaymin: #смотреть можно только это условие, т.к в данный момент объект minus всегда равен 1. x=0 for line in base: if len(line)>30 and line[12:15]!="Пол": if len(list(a[x]))==evrdaymin: #если количество строк в списке для x-го файла = количеству строк на каждый файл... min_list[x].writelines(a[x]) #...то записываем получившийся список в текущий файл... x+=1 #... и переходим к следующему a[x].append(line) #записываем строку в список для нового файла base.remove(line) #удаляем строку из исходного списка else: #если список на текущий файл не переполнен, то записываем строку в текущий список и её удаляем из исходного списка a[x].append(line) base.remove(line) print('В день рассылается по ' + str(evrdaymin) + ' смс.') min_list[x].writelines(a[x]) else: #если количество файлов>1 pass
print('%s %s %s' % (i,len(list(a[x])),evrdaymin)
Отредактировано aCL (Дек. 6, 2013 13:08:20)
Офлайн
0
обнаружил такую штуку
если перед последним циклом (непосредственно перед for) выводить base - выводится вся база - все строки.
если после for выводить line - то видно, что почему-то происходит пропуск каждой второй строки:
print(base) for line in base: print(line[:12])
['text1\n', 'text2\n', 'text3\n', 'text4\n'...]
text1
text3
...
Отредактировано aCL (Дек. 6, 2013 14:26:26)
Офлайн
0
…а если вставить тот же самый код между генератором списка a и условием - то построчный вывод отображает все строки…
У вас хороший форум, помогает самообучаться. Так, глядишь, сам решение найду…
Офлайн
7
Это потому, что во время цикла for у вас происходит изменение списка base
Офлайн
0
ааааа, надо base.copy() использовать!
Огромное спасибо
Офлайн
221
aCLУ нас хороший форум, но мы не роботы и тут не живем, а заходим когда на то есть время и желание.
У вас хороший форум, помогает самообучаться. Так, глядишь, сам решение найду…
aCLinput уже возвращает Int если ему передать int
int(input(
aCL
x=0
aCLэто Питон, здесь лучше писать for index,value in enumarate(something)
x+=1
Офлайн