Списки в Python из файла
Есть текстовый файл с именами и очками пользователей, например: Lisa 60 Fifa 0 Elka 140 Надо выдернуть эти данные в список (что бы имя было в столбце name, очки - в ochki), далее, если имя пользователя (которое он ввел ранее) есть в списке - то изменение его количества очков, если нету - новая запись в списке (по умолчанию кол-во очков нового пользователя 0), а далее выгрузка всего этого дела обратно в файл. Как это сделать? У меня получилось выгрузить файл в список, но такая выгрузка объединяет имена и очки пользователей в одну строку, из-за чего работа только с одним параметром (именем или очками) - не возможна.
import sys
class Igrok():
name = 'imya'
ochki = 0
#polsovatel = Igrok()
#polsovatel.name = input("Введите имя игрока")
def read2list(first_file):
first_file = open('C:\\Users\\Professional\\Desktop\\Tokarev\\table.txt', 'r', encoding='utf-8')
indata = first_file.read()
table = indata.split("\n")
return(table)
first_file.close()
table = read2list('table.txt')
print(table)
текстовый файл (https://i.stack.imgur.com/p8wXt.png)
вывод (https://i.stack.imgur.com/jeFO2.png)
Ответы (3 шт):
Я понял, у тебя проблема с парсингом данных из файла, вот тебе парсер, где и как применять думаю догадаешься сам.
def parse(data: str) -> dict:
result = dict()
data = data.split('\n') # Разбиваем по строкам
for line in data:
l = line.split() # l[0] Имя, l[1] очки
result.update({l[0]: int(l[1])})
return result
Насколько я понял, тебе нужно будет сделать ещё и наоборот. Из словаря в файл.
def parse_to_file(parsed_data: dict) -> str:
result = list()
for key, val in parsed.data.items():
result.append(f"{key} {val}")
return '\n'.join(result)
Результат parse("Alan 0\nPaul 1") будет {"Alan": 0, "Paul": 1}, а результат parse_to_file({"Sam": 5, "Alan": 20}) будет Sam 5\nAlan 20, Уже это значение можно записывать в файл.
for name, ochki in (line.split() for line in f.readlines()):
print(name,ochki,username)
думаю лучше данные такого рода хранить в csv файле
но модуль csv и с текстовым файлом справляется, так что можно попробовать такой способ (данные игроков в файле на отдельных строках, имена и очки разделены пробелом):
import csv
new_scores = {'joe':100,'mark':500} # данные для обновление очков игроков
file_path = r'table.txt' # путь к вашему файлу
with open(file_path, newline='') as file:
scores = csv.reader(file, delimiter=' ')
d = {k:int(v) for k,v in scores} # считали данные из файла в словарь
print(d)
for k,v in new_scores.items(): # добавляем в словарь очки и новых игроков
d[k] = d.get(k,0) + v
print(d) # обновленный словарь
with open(file_path, 'w', newline='') as file:
fieldnames = ['name', 'score']
writer = csv.DictWriter(file, fieldnames=fieldnames, delimiter=' ')
for k,v in d.items():
writer.writerow({'name': k, 'score': v}) # записываем новый словарь в файл
print (данные для примера):
{'joe': 10, 'helen': 20, 'bob': 30, 'luci': 40, 'donald': 50}
{'joe': 110, 'helen': 20, 'bob': 30, 'luci': 40, 'donald': 50, 'mark': 500}