Форум сайта python.su
0
У меня есть словарь с данными:
data = {'Вопрос': 'Категория', 'Вопрос 2': 'Категория', 'Вопрос 3': 'Категория 2',}
['dor1.ru', 'dor2.ru', 'dor3.ru']
dor1.ru_Категория.txt
dor1.ru_Категория 2.txt
dor2.ru_Категория.txt
dor2.ru_Категория 2.txt
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)
Офлайн
857
Нужно использовать самодельные функции. Программа набрала достаточную сложность для этого.
Здесь писал уже про структурную парадигму программирования.
Конкрентно для этой задачи должна быть функция загрузки категорий, функция загрузки вопросов, функция загрузки доменов. Затем уже делается функция соединения этих загруженных частей в записи для вывода. И потом уже делается функция для вывода записи в файл в определённом формате вывода. И сверху над ними функция управления всеми этими функциями.
Офлайн
0
Наверное, неправильно выразился. Как объединить результаты функций в один хаб я понимаю. Не пойму, как именно записывать первые 1000 строк в один файл, следующие 1000 строк в другой и т.д. Средствами стандартных файловых объектов open() не нашел как сделать.
Брать строку, записывать ее в файл, затем удалять эту строку - тоже не вариант. Т.к. если строк в исходном файле мало, то должны уже записанные ранее строки повторно добавляться в файлы, пока в каждом не будет по 1000 строк.
Может быть, есть какие-то библиотеки специальные для моей задачи?
Офлайн
857
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Это можно сделать. Достаточно узнать, что файловый объект - это итератор по строкам файла. У тебя же применяется .read(), который читает все строки файла как одно целое. А надо применить list(f) или просто в цикле брать строки и считать, пока тысяча не наберётся.
Не пойму, как именно записывать первые 1000 строк в один файл, следующие 1000 строк в другой и т.д. Средствами стандартных файловых объектов open() не нашел как сделать.
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)
Офлайн