Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 6, 2013 13:07:09

aCL
Зарегистрирован: 2013-11-13
Сообщения: 34
Репутация: +  0  -
Профиль   Отправить e-mail  

Перезапись строк текстового файла в несколько файлов

Задача следующая:
Есть файл в формате .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
Проблема в том, что записывается в данной ситуации 42 строки в файл, вместо 82
вставлял в код счетчик записанных номеров, соответственно, после a.append(line), после записи всех строк в список ‘a’ вставлял:
print('%s %s %s' % (i,len(list(a[x])),evrdaymin)
сообщение было: ‘42 42 82’, т.е. вместо 82 номеров по какой-то причине было записано только 42.
Подскажите, пожалуйста, в чем причина?
Заранее благодарен

Отредактировано aCL (Дек. 6, 2013 13:08:20)

Офлайн

#2 Дек. 6, 2013 14:25:49

aCL
Зарегистрирован: 2013-11-13
Сообщения: 34
Репутация: +  0  -
Профиль   Отправить e-mail  

Перезапись строк текстового файла в несколько файлов

обнаружил такую штуку
если перед последним циклом (непосредственно перед 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)

Офлайн

#3 Дек. 6, 2013 15:21:19

aCL
Зарегистрирован: 2013-11-13
Сообщения: 34
Репутация: +  0  -
Профиль   Отправить e-mail  

Перезапись строк текстового файла в несколько файлов

…а если вставить тот же самый код между генератором списка a и условием - то построчный вывод отображает все строки…


У вас хороший форум, помогает самообучаться. Так, глядишь, сам решение найду…

Офлайн

#4 Дек. 6, 2013 15:44:29

Master_Sergius
Зарегистрирован: 2013-09-12
Сообщения: 271
Репутация: +  7  -
Профиль   Отправить e-mail  

Перезапись строк текстового файла в несколько файлов

Это потому, что во время цикла for у вас происходит изменение списка base



———————————————————————————
Мой блог о семействе *nix: http://nixtravelling.blogspot.com/

Офлайн

#5 Дек. 6, 2013 15:52:14

aCL
Зарегистрирован: 2013-11-13
Сообщения: 34
Репутация: +  0  -
Профиль   Отправить e-mail  

Перезапись строк текстового файла в несколько файлов

ааааа, надо base.copy() использовать!
Огромное спасибо

Офлайн

#6 Дек. 7, 2013 02:37:55

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Перезапись строк текстового файла в несколько файлов

aCL
У вас хороший форум, помогает самообучаться. Так, глядишь, сам решение найду…
У нас хороший форум, но мы не роботы и тут не живем, а заходим когда на то есть время и желание.
aCL
int(input(
input уже возвращает Int если ему передать int
aCL
x=0
aCL
x+=1
это Питон, здесь лучше писать for index,value in enumarate(something)

зачем надо удалять строки из изначального списка не ясно (что собственно и стало причиной ошибки) - не ясно. Память вы на этом не сэкономите - потому что эту же строку кладете в другой список, а внутри питона будет лишь заменена ссылка



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version