Как прочитать данные c в этом странно структурированном текстовом файле? Python - PullRequest
0 голосов
/ 11 февраля 2020

Я разрабатываю дискорд-бота для игры Counter Strike Global Offensive и, пытаясь расширить его возможности, я столкнулся с тем, чего никогда раньше не видел. Я искал последние 4 часа и не могу найти что-то достаточно близкое для меня, чтобы установить связь. Я использую этот плагин для игры, которая помещает текстовый файл в каталог моих серверов, к которому я буду подключаться по FTP, чтобы получить доступ (я довольно легко запустил эту часть). https://github.com/splewis/get5/wiki/Stats-system

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

Что я пытаюсь сделать do: Считать указанные c строки данных из неизвестного структурированного текстового файла и превращать их в строки после каждой игры.

Мой код (просто чтение текстового файла)

   with open('get5_matchstats.cfg', 'r') as file:
   data = file.read()
print(data)

Вывод (точно так же, как в текстовом файле):

"Stats"
{
    "series_type"       "bo1"
    "map0"
    {
        "team1"
        {
            "76561628991367478"
            {
                "roundsplayed"      "7"
                "name"      "CoC Legende"
                "deaths"        "3"
                "damage"        "415"
                "kills"     "4"
                "headshot_kills"        "2"
                "1kill_rounds"      "4"
                "firstdeath_ct"     "2"
                "firstkill_ct"      "1"
            }
            "7655212110096592"
            {
                "roundsplayed"      "7"
                "name"      "payperview"
                "deaths"        "2"
                "firstdeath_ct"     "1"
                "damage"        "672"
                "kills"     "6"
                "1kill_rounds"      "1"
                "headshot_kills"        "3"
                "3kill_rounds"      "1"
                "firstkill_ct"      "1"
                "assists"       "1"
                "2kill_rounds"      "1"
            }
            "76561198821291593"
            {
                "roundsplayed"      "7"
                "name"      "dog"
                "damage"        "458"
                "deaths"        "3"
                "assists"       "1"
                "firstdeath_ct"     "1"
                "firstkill_ct"      "2"
                "kills"     "4"
                "1kill_rounds"      "1"
                "headshot_kills"        "2"
                "3kill_rounds"      "1"
            }
            "76561668131605879"
            {
                "roundsplayed"      "7"
                "name"      "Cat"
                "damage"        "640"
                "firstkill_ct"      "1"
                "kills"     "7"
                "2kill_rounds"      "1"
                "bomb_defuses"      "1"
                "1kill_rounds"      "5"
                "tradekill"     "1"
                "headshot_kills"        "1"
            }
            "76566648819479703"
            {
                "roundsplayed"      "7"
                "name"      "BackAndImBetter"
                "damage"        "801"
                "kills"     "9"
                "3kill_rounds"      "2"
                "firstkill_ct"      "1"
                "headshot_kills"        "3"
                "assists"       "1"
                "2kill_rounds"      "1"
                "deaths"        "1"
                "bomb_defuses"      "1"
                "1kill_rounds"      "1"
            }
            "score"     "6"
        }
        "team2"
        {
            "76561198120865213"
            {
                "roundsplayed"      "7"
                "name"      "Squid"
                "damage"        "231"
                "deaths"        "6"
                "firstdeath_t"      "2"
                "kills"     "1"
                "headshot_kills"        "1"
                "1kill_rounds"      "1"
            }
            "76561198355321210"
            {
                "roundsplayed"      "7"
                "name"      "Chub vc_0"
                "damage"        "106"
                "kills"     "1"
                "deaths"        "6"
                "1kill_rounds"      "1"
                "firstdeath_t"      "1"
            }
            "76561197963353523"
            {
                "roundsplayed"      "7"
                "name"      "Bravo"
                "damage"        "630"
                "assists"       "1"
                "deaths"        "6"
                "firstdeath_t"      "1"
                "bomb_plants"       "2"
                "kills"     "3"
                "1kill_rounds"      "1"
                "firstkill_t"       "1"
                "2kill_rounds"      "1"
            }
            "76561198111573735"
            {
                "roundsplayed"      "7"
                "name"      "Manager"
                "damage"        "255"
                "firstkill_t"       "2"
                "kills"     "3"
                "headshot_kills"        "1"
                "deaths"        "6"
                "2kill_rounds"      "1"
                "1kill_rounds"      "1"
                "firstdeath_t"      "2"
            }
            "76561198853686342"
            {
                "roundsplayed"      "7"
                "name"      "Compliment"
                "damage"        "282"
                "deaths"        "6"
                "assists"       "1"
                "firstkill_t"       "1"
                "kills"     "1"
                "headshot_kills"        "1"
                "1kill_rounds"      "1"
            }
            "score"     "0"
        }
        "mapname"       "de_season"
    }
}


Process finished with exit code 0

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

Единственная вещь, в которой, как мне кажется, мне нужна помощь, - это выяснить, как конкретно получить такие вещи, как счет команды, убийства пользователей, смертельные случаи, урон и т. д. c.

Большое спасибо за ваше ребята время, имея это немного знаний поможет мне значительно улучшить мой бот.

1 Ответ

0 голосов
/ 11 февраля 2020

Из того, что я вижу, когда вы находитесь внутри объекта карты (фигурные скобки), вы можете увидеть шаблон, который похож на объект json.

Решение, которое я собираюсь предложить следует использовать только в том случае, если файл с этой статистикой является небольшим файлом, в противном случае будет много дополнительной памяти.

Решение: прочитайте файл и создайте его в объект, у которого есть список и словарь для запросов.

def convert_file_into_object(file):
    team_object = {}
    team_name = ""
    player_id = ""
    for line in file.readlines():
        line = line.replace('"', '').strip()

        if "{" in line:
            continue
        if "}" in line:
            if player_id:
                player_id = ""
            continue

        if "team" in line:  # team object starts so add a new dict with team name
            team_name = line
            team_object[team_name] = []
            continue

        if line.isnumeric():  # we have hit player id, so add new player in current team
            player_id = line
            team_object[team_name].append({player_id: {}})
            continue

        player_stats = line.split()
        if len(player_stats) == 2 and team_name and player_id:  # we have players stats
            team_object[team_name][len(team_object[team_name]) - 1][player_id][player_stats[0]] = player_stats[1]

    return team_object


with open("data.txt", "r") as file:
    file_object = convert_file_into_object(file)

    from pprint import pprint as pp
    pp(file_object)

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

Вывод в REPL при сохранении вышеуказанного кода в модуле robo.py.

 gaurishankarbadola@ubuntu:~/python_path$ python robo.py 
{'team1': [{'76561628991367478': {'1kill_rounds': '4',
                                  'damage': '415',
                                  'deaths': '3',
                                  'firstdeath_ct': '2',
                                  'firstkill_ct': '1',
                                  'headshot_kills': '2',
                                  'kills': '4',
                                  'roundsplayed': '7'}},
           {'7655212110096592': {'1kill_rounds': '1',
                                 '2kill_rounds': '1',
                                 '3kill_rounds': '1',
                                 'assists': '1',
                                 'damage': '672',
                                 'deaths': '2',
                                 'firstdeath_ct': '1',
                                 'firstkill_ct': '1',
                                 'headshot_kills': '3',
                                 'kills': '6',
                                 'name': 'payperview',
                                 'roundsplayed': '7'}},
           {'76561198821291593': {'1kill_rounds': '1',
                                  '3kill_rounds': '1',
                                  'assists': '1',
                                  'damage': '458',
                                  'deaths': '3',
                                  'firstdeath_ct': '1',
                                  'firstkill_ct': '2',
                                  'headshot_kills': '2',
                                  'kills': '4',
                                  'name': 'dog',
                                  'roundsplayed': '7'}},
           {'76561668131605879': {'1kill_rounds': '5',
                                  '2kill_rounds': '1',
                                  'bomb_defuses': '1',
                                  'damage': '640',
                                  'firstkill_ct': '1',
                                  'headshot_kills': '1',
                                  'kills': '7',
                                  'name': 'Cat',
                                  'roundsplayed': '7',
                                  'tradekill': '1'}},
           {'76566648819479703': {'1kill_rounds': '1',
                                  '2kill_rounds': '1',
                                  '3kill_rounds': '2',
                                  'assists': '1',
                                  'bomb_defuses': '1',
                                  'damage': '801',
                                  'deaths': '1',
                                  'firstkill_ct': '1',
                                  'headshot_kills': '3',
                                  'kills': '9',
                                  'name': 'BackAndImBetter',
                                  'roundsplayed': '7'}}],
 'team2': [{'76561198120865213': {'1kill_rounds': '1',
                                  'damage': '231',
                                  'deaths': '6',
                                  'firstdeath_t': '2',
                                  'headshot_kills': '1',
                                  'kills': '1',
                                  'name': 'Squid',
                                  'roundsplayed': '7'}},
           {'76561198355321210': {'1kill_rounds': '1',
                                  'damage': '106',
                                  'deaths': '6',
                                  'firstdeath_t': '1',
                                  'kills': '1',
                                  'roundsplayed': '7'}},
           {'76561197963353523': {'1kill_rounds': '1',
                                  '2kill_rounds': '1',
                                  'assists': '1',
                                  'bomb_plants': '2',
                                  'damage': '630',
                                  'deaths': '6',
                                  'firstdeath_t': '1',
                                  'firstkill_t': '1',
                                  'kills': '3',
                                  'name': 'Bravo',
                                  'roundsplayed': '7'}},
           {'76561198111573735': {'1kill_rounds': '1',
                                  '2kill_rounds': '1',
                                  'damage': '255',
                                  'deaths': '6',
                                  'firstdeath_t': '2',
                                  'firstkill_t': '2',
                                  'headshot_kills': '1',
                                  'kills': '3',
                                  'name': 'Manager',
                                  'roundsplayed': '7'}},
           {'76561198853686342': {'1kill_rounds': '1',
                                  'assists': '1',
                                  'damage': '282',
                                  'deaths': '6',
                                  'firstkill_t': '1',
                                  'headshot_kills': '1',
                                  'kills': '1',
                                  'name': 'Compliment',
                                  'roundsplayed': '7'}}]}

Когда у вас есть объект, вы можете запросить его соответственно.

...