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

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

Я так понимаю, что нужно сделать несколько файлов а именно:

  • Data.txt - тот кусок кода что нужно вставить (подготовленные данные с кавычками, запятыми и т.д.). Например:
    "Rob35",
    "tube33",
    
  • Файлы от 1 до 2000
  • Restart.py - то что добавит в каждый файл кусок кода

В итоге мы имеем 2000 файлов, что лежат отдельно, и когда мне нужно будет их изменить, то я:

  1. Копирую 2000 файлов без куска нового кода.
  2. Запускаю Restart.py, чтобы в каждый файл он добавил новый код.
  3. Запускаю сами программы.
  4. При необходимости повторяю процедуру.

Что нужно прописать в файле Restart.ру?

Немного сумбурно, но если что готов ответить на вопросы.

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

text(
    [
       Streamer("streamer-username07"), 
       Streamer("streamer-username08"), 
        "streamer-username09", 
        "streamer-username10", 
        "streamer-username11" 
    ],                                  # Array of streamers (order = priority) 
    followers=False,                    # Automatic download the list of your followers 
    followers_order=FollowersOrder.ASC  # Sort the followers list by follow date. ASC or DESC 
)

Всем откликнувшимся большое спасибо, не ожидал такого актива


Ответы (2 шт):

Автор решения: Oopss
with open('d_data.txt', 'r', encoding='utf8') as f_src:
    txt = f_src.read()
with open('d_main.py', 'r', encoding='utf8') as f:
    my_file = f.read()
    res = ''
    for s in my_file.split('\n'):
        if s == '# Но перед этой':
            res +=f'# {txt.strip()} \n'
        res += s+'\n'
with open('d_main.py', 'w', encoding='utf8') as f:
    f.write(res)

# Вставить после этой строки
# Но перед этой

Я уже не знаю кто задает вопрос :), но предлагаю ответ:

import os
# В текущей директории создать директорию files
# закинуть все файлы в директорию files
directory = r'files/'

for f in os.listdir(directory):
    if os.path.isfile(os.path.join(directory, f)):
        with open(directory + f, 'a', encoding='utf8') as edit_file:
            edit_file.write(f'# новая строка \n')
# во все файлы в директории files добавится "новая строка" в конец
→ Ссылка
Автор решения: Vitalizzare ушел в монастырь

Если обновляемый список одинаковый для всех скриптов, то было бы разумно держать его в одном месте, а концовку скриптов изменить таким образом:

streamer_data = '.../data.txt'   # Путь к файлу изменяемых данных

with open(streamer_data) as data_file:
    streamer_usernames = list(map(str.rstrip, data_file))

text(
    list(map(Streamer, streamer_usernames)),   # Array of streamers (order = priority) 
    followers=False,   # Automatic download the list of your followers 
    followers_order=FollowersOrder.ASC   # Sort the followers list by follow date. ASC or DESC 
)

Внутри data.txt - только имена пользователей, каждое на отдельной строке без дополнительных кавычек и запятых. Разовое редактирование программ может выглядеть так:

from pathlib import Path

original_scripts = ...   # путь к папке с исходными скриптами
updated_scripts = ...    # путь к папке для хранение обновленных скриптов
data = ...               # путь к файлу обновляемых данных

dest = Path(updated_scripts)
new_part = f'''
streamer_data = {data}
with open(streamer_data) as data_file:
    streamer_usernames = list(map(str.rstrip, data_file))
text(
    list(map(Streamer, streamer_usernames)),
    followers=False,
    followers_order=FollowersOrder.ASC
)
'''

for file in Path(original_scripts).glob('*.py'):
    with open(file) as f:
        script = f.read()
    ...   # Здесь может быть очистка скрипта при необходимости 
    with open(dest/file.name, 'wt') as f:
        f.write(script)
        f.write(new_part)

P.S. Предложенный выше код добавляет в программы новые переменные. Я их использовал, чтобы последовательно раскрыть идею. Но это сопряжено с риском перекрытия ранее определенных переменных редактируемых программ. При желании, эти имена можно исключить. Например:

...
new_part = f'''
text(
    [Streamer(name) for line in open({data}) if (name:=line.rstrip())],
    followers=False,
    followers_order=FollowersOrder.ASC
)'''
...
→ Ссылка