Прочитайте .txt в Python Object и создайте список - PullRequest
2 голосов
/ 11 июля 2019

Я пытаюсь сделать карточную игру с использованием Python. Ниже приведен текстовый файл, в котором указаны идентификатор карты, имя карты, описание карты и точка попадания карты.

1, Medusa, Feel The Wraith, 98
2, Gigle , See Him See Him, 54
3, Brozi , Pinch an inch, 91

Ниже у меня есть немного питона. У меня есть этот класс Python, который просто карта. То, что я хочу сделать, это иметь колоду (список) этих карт (объектов класса). Вот некоторый код, который я пытаюсь сделать, который будет читать текстовый файл и помещать их в объекты, а затем в список.

import sys
import os
class Card:
    def__init__(self, card_id, name, desc, hp):
        self.card_id = card_id
        self.name = name
        self.desc = desc
        self.hp = hp
        self.cards = []

deck = []

fh = open('dets.txt').readlines()
for line in fh:
    row = line.split(',')
    card_id, name, desc, hp = [i.strip() for i in row]
    card = deck.get(card_id, Card(card_id, name, desc, hp))
    deck[card_id] = card

Я на трассе? Я относительно новичок в Python. Спасибо

Ответы [ 4 ]

2 голосов
/ 11 июля 2019

Если вы просто хотите поместить эти объекты карты в список, сделайте следующее:

deck = []
fh = open('dets.txt').readlines()
for line in fh:
    row = line.split(',')
    card_id, name, desc, hp = [i.strip() for i in row]
    card = Card(card_id, name, desc, hp)
    deck = deck + [ card ] 

Иначе, посмотрев на ваш код, я думаю, что вы хотите сохранить их в словаре с card_idкак key.Чтобы сохранить их в словаре,

deck = {} #dictionary
fh = open('dets.txt').readlines()
for line in fh:
    row = line.split(',')
    card_id, name, desc, hp = [i.strip() for i in row]
    card = Card(card_id, name, desc, hp)
    deck[card_id] = card #'card_id' is the 'key' and 'card' is 'value'

Чтобы напечатать название карточек в словаре, используйте for-loop,

for each_key in deck:
    print(each_key, " - ", deck[each_key].name )

. Это даст вывод:

1  -  Medusa
2  -  Gigle
3  -  Brozi
0 голосов
/ 11 июля 2019

Вы можете значительно упростить свой код, а также сделать его более Python, выполнив следующие действия:

  1. Используйте with open('dets.txt') as f, чтобы прочитать ваш файл. Вы должны закрыть файл, когда открываете его, и этот менеджер контекста позволяет вам закрывать его независимо от того, что происходит при чтении файла.
  2. Учитывая, что порядок параметров в строке совпадает с порядком аргументов, которые вы определили в вашем методе init, вы можете использовать функцию Python, называемую list unpacking .

Таким образом, вы можете использовать следующий код:

import sys
import os
class Card:
    def__init__(self, card_id, name, desc, hp):
        self.card_id = card_id
        self.name = name
        self.desc = desc
        self.hp = hp
        self.cards = []

deck = []

with open('dets.txt') as f:
    for line in f:
        args = line.strip().split(', ')
        args[0] = int(args[0])
        args[-1] = int(args[-1])
        deck.append(Card(*args))

Учитывая, что вы используете Python 3.7 +

Вы можете использовать dataclases, чтобы упростить определение класса следующим образом:

@dataclass
class Card:
    card_id: int
    name: str
    desc: str
    hp: int
0 голосов
/ 11 июля 2019

Вы используете список, и у него нет метода get. Попробуйте использовать словарь

Это поможет вам получить объект класса

отл.

myDict = {card_id1 : CardObject1, card_id2 : CardObject2, ....}

Поэтому, если вы хотите получить объект карты, просто наберите

if card_id in myDict.keys():
    myDict(card_id)
0 голосов
/ 11 июля 2019

Сделать нижнюю часть:

deck = []

with open('dets.txt') as fh:
    for line in fh:
        row = line.strip().split(', ')
        deck.append(Card(*row))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...