Найти - Пользователи
Полная версия: Перезапись строк текстового файла в несколько файлов
Начало » Python для новичков » Перезапись строк текстового файла в несколько файлов
1
aCL
Задача следующая:
Есть файл в формате .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
обнаружил такую штуку
если перед последним циклом (непосредственно перед for) выводить base - выводится вся база - все строки.
если после for выводить line - то видно, что почему-то происходит пропуск каждой второй строки:

print(base)
        for line in base:
            print(line[:12])

выводит:
['text1\n', 'text2\n', 'text3\n', 'text4\n'...]
text1
text3
...

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


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

зачем надо удалять строки из изначального списка не ясно (что собственно и стало причиной ошибки) - не ясно. Память вы на этом не сэкономите - потому что эту же строку кладете в другой список, а внутри питона будет лишь заменена ссылка
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB