Лучший способ извлечь информацию из файла

#python #file #extract

#python #файл #извлечь

Вопрос:

Например, мой файл:

 Game #51236595 Tourney #123698521 Hand #9865653215
player luisgustavo call
player otherplayer fold
player otherother  check
  

Я хочу получить информацию наилучшим образом.
Помните, что все файлы находятся в этом формате. Какие изменения в числах и игроках

РЕДАКТИРОВАТЬ: Хорошо, но это не домашнее задание. Я делал это несколько раз, но я не думаю, что это лучший способ.

 with open(".myfile", "r") as myfile:
    for line in myfile:
        if "Game" in line:
            game_number = line[line.find('#') 1 : line.find("Tourney")-2]
            tourney_number = line[line.find('Tourney #') 9 : line.find("Hand")-2]
            hand_number = line[line.find('Hand #') 6 : ]
        elif "player" in line:
            player_name = line[line.find(' ') 1 : line.rfind(' ')]
            player_action = line[line.rfind(' ') 1 : ]
  

Код работает отлично. Но я не думаю, что у хорошего кода должен быть лучший способ сделать это.

Комментарии:

1. Это похоже на домашнее задание, пожалуйста, покажите нам, что вы пробовали, и мы с радостью поможем вам, если у вас возникнут проблемы.

Ответ №1:

Попробуйте что-то вроде

 with open('.myfile', 'r') as myfile:
    header = myfile.readline().split()
    game_number, tourney_number, hand_number = header[1], header[3], header[5]
    for line in myfile:
        player_name, player_action = line.split()[1:]
  

Это использует split() [docs] и гораздо более pythonic.

Комментарии:

1. Я собирался написать что-то похожее на это. Но вместо того, чтобы дважды вызывать line.split() в последней строке, просто сделайте это один раз, например: player_tag, player_name, player_action = line.split() .

2. Это также не совсем понятно, но из примера в вопросе может быть возможно, что в одном файле может быть несколько игр. В этом случае обнаружение строки «game» необходимо проверять и обрабатывать в цикле.

3. @ChrisPhillips Хороший вызов в последней строке, когда я писал это, я не думал ясно :). Если в файле более одной игры, вам придется связать данные игрока с данной игрой, и я предполагаю, что, поскольку «рабочий код» этого не делает, мой тоже не нужен.

4. Спасибо за помощь, теперь код стал намного лучше. Я уже могу подобрать несколько игр для каждого файла.

Ответ №2:

Вы можете использовать csv.reader с пользовательским диалектом для общего решения с большим количеством уже отсортированных деталей.

Ответ №3:

Основываясь на ответе, данном @brc выше:

 with open(".myfile", "r") as myfile:
    for line in myfile:
        parts = line.split()

        if parts[0] == 'Game':
            game_tag, game_number, tourney_tag, tourney_number, hand_tag, hand_number = parts
            continue

        player_tag, player_name, player_action = parts
  

Это четко извлекает нужные вам фрагменты с минимальными затратами. Конечно, вам также нужно будет что-то сделать со значениями. Кроме того, я предполагаю, что в файле может быть несколько строк «game». Если это не так, вы можете просто проверить это в первой строке.