Python записывает данные только в первую строку другого файла

Я пытаюсь удалить строку с определенным словом из файла и записать ее в другой файл. Идея такова: у меня есть building_objects и после завершения строительства я должен удалить строку со зданием из файла и записать ее в файл "finished_objects" с датой, мой код удаляет строку из building_objects и записывает в finish_objects, но только в первую строку . Он удаляет существующие данные в finish_objects и помещает данные из building_objects в первую строку.

Мне нужно сделать новые строки, чтобы затем записать данные из building_objects, как я могу это сделать?

def finish_object():
    tomorrow = datetime.datetime.now()
    finish_object = input("Write name of building:")
    with open("build_objects.txt", "r",encoding = "UTF8") as w:
        lines = w.readlines()
    with open("build_objects.txt", "w",encoding = "UTF8") as w,open('finished_objects.txt', 'w',encoding = "UTF8") as destination:
        for line in lines:
            if finish_object not in line:
                w.write(line)
            else:
                destination.write(line)
                tomorrow = tomorrow + datetime.timedelta(days=1)
                destination.write(',')
                destination.write('{:%d/%m/%Y}'.format(tomorrow))
                destination.write('\n')

building_objects.txt:

Place,building,quantity
New York,cinema,3

вам нужно будет прочитать все строки из finish_object в список, заменить первую строку в списке и снова написать все строки.

furas 31.03.2022 06:44

Можете ли вы предоставить некоторые примеры данных, которые показывают, как это выглядит и как вы хотите, чтобы это выглядело?

alexpdev 31.03.2022 09:06

@alexpdev сделано

amir 31.03.2022 10:39

@furas с петлей? как я могу это сделать

amir 31.03.2022 10:40

сначала загрузите полный finished_objects в виде списка строк, затем выполните цикл, чтобы заменить первую строку в списке, а после цикла снова напишите все строки.

furas 31.03.2022 11:00

@furas, можешь показать, как тебе нравится?

amir 31.03.2022 11:58
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
6
34
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Сначала загрузите полный finished_objects в виде списка строк, затем выполните цикл для замены первой строки в списке (или вставьте в качестве первой строки перед другими строками), а после цикла снова напишите все строки.

Что-то вроде этого (но не проверено):

def finish_object(building_name):
    tomorrow = datetime.datetime.now() + datetime.timedelta(days=1)
    tomorrow_str = tomorrow.strftime('%d/%m/%Y')
    
    # --- read all files ---
    
    with open("build_objects.txt", "r", encoding = "UTF8") as w:
        build_objects_lines = w.readlines()
        
    with open('finished_objects.txt', 'r', encoding = "UTF8") as w:
        finished_objects_lines = w.readlines()

    # --- change lines ---

    found = False
    
    for number, line in enumerate(build_objects_lines):
        if building_name in line:
            new_line = line.rstrip('\n') + ',{}\n'.format(tomorrow_str)
            finished_objects_lines.insert(0, new_line)  # insert before other lines
            del build_objects_lines[number]
            found = True
            break  # I assume this building is only once in file
            
    # --- write all files ---
    
    if not found:
        print("I can't find:", building_name)
    else:        
        with open("build_objects.txt", "w", encoding = "UTF8") as w:
            for line in build_objects_lines:
                w.write(line)
                    
        with open("finished_objects.txt", "w", encoding = "UTF8") as w:
            for line in finished_objects_lines:
                w.write(line)
        
# --- main ---

name = input("Write name of building:")
finish_object(name)

Другие вопросы по теме