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

Нам дан файл со списком покупок за месяц. Всего есть 5 категорий. У каждого элемента каждой категории есть цена(сумма, которую потратили на одну позицию этой категории) и скидка. Мне необходимо записать строки с новой ценой(посчитанной с учетом скидки) в файл, но строки пишутся через знак новой строки(каждая string на новой строке, поэтому в файл записывается только крайняя. Как это исправить?

from operator import *
with open('6_4.txt', 'r') as file:
    content = file.read()
    content = content.split('\n')[1:]
    sorted_content = sorted(sorted(content, key=itemgetter(1)))
    in_string = '\n'.join(sorted_content)
file.close()

with open('new_list.txt', 'w') as file:
    file.write(in_string)
file.close()

with open('new_list.txt', 'r') as file:
    for s in file:
        content = s.split()
        cost = int(content[1]) - (int(content[1]) * (int(content[2]) // 100))
        for i, x in enumerate(content):
            if x == content[1]:
                content[1] = str(cost)
        content = content[:-1]
        in_string = ' '.join(content)
file.close()

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

Автор решения: vitidev

У вас слишком много сомнительных моментов и указывать на неточности можно долго, поэтому проще показать что то рабочее, из которого вы почерпнете нужное.

Не очень понятно про сортировку, поэтому если сортировка по имени категории и файл выглядит как

name price discount
aaa 90 20
bbb 75 10
ccc 87 11
abc 30 50

то один из вариантов решения такой

1 Читаем данные и сразу считаем

data = []
with open('6_4.txt', 'r', encoding='utf-8') as f:
    next(f)  # пропускаем хидер
    for line in (_ for _ in map(str.strip, f) if _):  # сразу убираем \n и пропускаем пустые строки
        name, price, discount = line.split()
        price, discount = map(int, (price, discount))
        cost = price - price * (discount / 100)
        data.append({'name': name, 'cost': cost})

или с помощью csv

import csv

data = []
with open('6_4.txt', 'r', encoding='utf-8', newline='') as f:
    reader = csv.DictReader(f, delimiter=' ')
    for item in reader: # type: dict[str]
        cost = int(item['price']) - int(item['price']) * (int(item['discount']) / 100)
        data.append({'name': name, 'cost': cost})

сортируем на месте

data.sort(key=lambda x: x['name'])

и сохраняем

with open('result.txt', 'w', encoding='utf-8') as f:
    f.write("\n".join(f"{e['name']} {e['cost']}" for e in data))

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

# увы приходится бубен чтобы избежать лишнего \n в конце
firstline = True
with open('result.txt', 'w', encoding='utf-8') as f:
    started = False
    for e in data:
        if started:
            f.write('\n')
        started = True
        f.write(f"{e['name']} {e['cost']}")

точно так же можно доверить сохранение модулю csv

csv.register_dialect("slashes", delimiter=" ")
fnames = ['name', 'cost']
with open('result.csv', 'w', encoding='utf-8', newline='') as f:
    writer = csv.DictWriter(f, fieldnames=fnames, dialect='slashes', lineterminator='\n')
    writer.writeheader() # если нужен хидер конечно
    for item in data:
        writer.writerow(item)

который влепит лишний \n в конце - такая уж реализация этого модуля (

→ Ссылка