Как записать отдельные друг от друга строки в файл? 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 шт):
У вас слишком много сомнительных моментов и указывать на неточности можно долго, поэтому проще показать что то рабочее, из которого вы почерпнете нужное.
Не очень понятно про сортировку, поэтому если сортировка по имени категории и файл выглядит как
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
в конце - такая уж реализация этого модуля (