Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 5, 2019 21:11:45

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

Как записать данные в файл с удалением строк?

У меня есть словарь с данными:

 data = {'Вопрос': 'Категория', 'Вопрос 2': 'Категория', 'Вопрос 3': 'Категория 2',}

Категории могут совпадать.

И список доменов:
 ['dor1.ru', 'dor2.ru', 'dor3.ru']

Стоит задача создать файлы вида:
dor1.ru_Категория.txt
dor1.ru_Категория 2.txt
dor2.ru_Категория.txt
dor2.ru_Категория 2.txt

В эти файлы должны записываться вопросы из словаря data, с новой строки.

В скрипте нужно указать, сколько вопросов должно быть на каждый домен. К примеру, указываем 1000. Скрипт должен в каждый файл с доменом суммарно записать по 1000 вопросов.

Если вопросов не хватило для записи, скрипт должен повторно выполнить цикл с начала, чтобы добить до 1000.

Я написал скрипт, который в итоге сохраняет вопросы в файлы, но с распределением не могу понять как сделать.

 home_pass = '/my/dir/pass/'
with open(home_pass + 'keywords.txt') as f: # тут файл со строками:
    # Вопрос;Категория
    # Вопрос другой;Категория
    # Еще вопрос;Категория 2
    onstring = f.read().split('\n')[:-1] # список
data = {}
for item in onstring:
    question = item.split(';')[0]
    cat = item.split(';')[-1]
    data[question] = cat # {'Вопрос': 'Категория'}
with open(home_pass + 'domains.txt') as f:
    domains = f.read().split('\n')[:-1] # ['dor1.ru', 'dor2.ru', 'dor3.ru']
for domain in domains:
    for item in data:
        with open(home_pass + '/rezult/' + domain + '_' + data[item] + '.txt', 'a') as f:
            f.write(item + '\n')

Подскажите, как сделать можно или где посмотреть примеры.

Отредактировано barbiturat (Окт. 5, 2019 21:12:41)

Офлайн

#2 Окт. 6, 2019 13:09:30

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10024
Репутация: +  857  -
Профиль   Отправить e-mail  

Как записать данные в файл с удалением строк?

Нужно использовать самодельные функции. Программа набрала достаточную сложность для этого.

Здесь писал уже про структурную парадигму программирования.

Конкрентно для этой задачи должна быть функция загрузки категорий, функция загрузки вопросов, функция загрузки доменов. Затем уже делается функция соединения этих загруженных частей в записи для вывода. И потом уже делается функция для вывода записи в файл в определённом формате вывода. И сверху над ними функция управления всеми этими функциями.



Офлайн

#3 Окт. 6, 2019 17:59:27

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

Как записать данные в файл с удалением строк?

Наверное, неправильно выразился. Как объединить результаты функций в один хаб я понимаю. Не пойму, как именно записывать первые 1000 строк в один файл, следующие 1000 строк в другой и т.д. Средствами стандартных файловых объектов open() не нашел как сделать.

Брать строку, записывать ее в файл, затем удалять эту строку - тоже не вариант. Т.к. если строк в исходном файле мало, то должны уже записанные ранее строки повторно добавляться в файлы, пока в каждом не будет по 1000 строк.

Может быть, есть какие-то библиотеки специальные для моей задачи?

Офлайн

#4 Окт. 6, 2019 18:50:01

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10024
Репутация: +  857  -
Профиль   Отправить e-mail  

Как записать данные в файл с удалением строк?

barbiturat
Не пойму, как именно записывать первые 1000 строк в один файл, следующие 1000 строк в другой и т.д. Средствами стандартных файловых объектов open() не нашел как сделать.
Ну так тебе и говорят, что надо функции свои писать. А чтобы писать свои функции, это надо изучить, так как там много всяких принципов.

У тебя должна быть функция, которая добывает нужные строки и возвращает их. У тебя должна быть функция, которая принимает добытые строки и имя файла для их вывода. В результате вызова этих функций у тебя будут добыты строки и потом переданы на запись.

Если у тебя строк в файле не хватает, то функция должна их нагенерить и вернуть.

Вот пример генерации строк и возвращения их из функции
  
>>> def generate_lines(number):
...     out = []
...     for i in range(number):
...         out.append('строка {}'.format(i + 1))
...     return out
... 
>>> lines = generate_lines(10)
>>> lines
['строка 1', 'строка 2', 'строка 3', 'строка 4', 'строка 5', 'строка 6', 'строка 7', 'строка 8', 'строка 9', 'строка 10']
>>>
Тут можно сгенерировать десять строк, можно сгенерировать тысячу строк, а можно и файл ещё открывать внутри функции и какие-то первые строки брать из него, а остальные добавлять после них. Главное, что снаружи функции неизвестно, как она добывает строки, поэтому ты можешь их брать как из файла, так и из воздуха. Самое интересное начинается тогда, когда к фунцкии внутри прикручивается другая функция, у которой тоже что-то интересное внутри происходит.

И вот чтобы писать такие конструкции, нужно изучать структурную парадигму, в которой много всякой информации. На угадайке тут много не достигнешь. Надо книжки читать и примеры в них смотреть, копировать стиль написания кода, перенимать правила.


barbiturat
Не пойму, как именно записывать первые 1000 строк в один файл, следующие 1000 строк в другой и т.д. Средствами стандартных файловых объектов open() не нашел как сделать.
Это можно сделать. Достаточно узнать, что файловый объект - это итератор по строкам файла. У тебя же применяется .read(), который читает все строки файла как одно целое. А надо применить list(f) или просто в цикле брать строки и считать, пока тысяча не наберётся.

Пример итерации по строкам файла
  
with open('file.txt', encoding='utf-8') as fin:
    for i in fin:
        print(i)

Пример взятия части строк из файла, а части сгенерённой
  
>>> def generate_lines(number):
...     out = []
...     for i in range(number):
...         out.append('строка {}'.format(i + 1))
...     return out
... 
>>> def read_n_lines(fname, number):
...     out = []
...     n = 0
...     with open(fname, encoding='utf-8') as fin:
...         for i in fin:
...             out.append(i)
...             n += 1
...             if n >= number:
...                 break
...     if n < number:
...         out.extend(generate_lines(number - n))
...     return out
... 
>>> lines = read_n_lines('/etc/passwd', 500)
>>> lines[:3]
['root:x:0:0:root:/root:/bin/bash\n', 'bin:x:1:1:bin:/bin:/sbin/nologin\n', 'daemon:x:2:2:daemon:/sbin:/sbin/nologin\n']
>>> lines[-3:]
['строка 454', 'строка 455', 'строка 456']
>>> len(lines)
500
>>>



Отредактировано py.user.next (Окт. 6, 2019 19:09:17)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version