在 Python 中解析 CS:GO 脚本文件

2023-12-01

我正在使用 CS:GO 中的一些脚本文件,我必须从该文件中获取一些有用的信息并将这些数据导入到我的 python 应用程序中。

以下是txt数据格式的示例:

https://steamcdn-a.akamaihd.net/apps/730/scripts/items/items_game.83a9ad4690388868ab33c627af730c43d4b0f0d9.txt

这些值采用随机格式(Color\Pos\String),但我只需要一个字符串,其中包含所有值。 我需要将此信息放入字典中,例如:

print(global_dict['items_game']['game_info']['first_valid_class'])
<<2

我现在正在研究解析器,但遇到了很多问题。对于该文件格式有现成的解决方案吗?


As 科里·克莱默指出,该文件是almost JSON.

因此,我在下面编写了一个自定义解析器,它通过逐行读取源配置并将正确的 JSON 格式写入输出文件来解析文件。

我什至使用测试了输出JSONLint并且文件已成功验证。

Note:编写此代码是为了解析位于以下位置的任何文件:

%STEAMINSTALL%/SteamApps/common/Counter-Strike Global Offensive/csgo/scripts


要使用以下脚本,请执行:

 $ ConfigParser.py -h

 usage: ConfigParser.py [-h] [-s SRC] dest
 
 positional arguments:
   dest               file where the parsed JSON will be written to
 
 optional arguments:
   -h, --help         show this help message and exit
   -s SRC, --src SRC  source config file
#!/usr/bin/env python3

"""ConfigParser.py: Parses a Valve configuration file.

The configuration file for the CS:GO game items is read line-by-line
and written to an output file. The missing colons and commas are added
to their appropriate places. The output file passed JSLint validation.
"""

from argparse import ArgumentParser
from shlex import split

__author__ = "Mr. Polywhirl"
__copyright__ = "Copyright 2016, Stack Overflow"
__credits__ = []
__license__ = "GPLv3"
__version__ = "1.1.0"
__maintainer__ = "Mr. Polywhirl"
__email__ = "https://stackoverflow.com/users/1762224"
__status__ = "Production"

# This is the default file that is parsed.
DEFAULT_CONFIG_FILE = 'C:/Program Files (x86)/Steam/steamapps/common/\
Counter-Strike Global Offensive/csgo/scripts/items/items_game.txt'

def parseConfig(src_filename, dest_filename):
    out_file = open(dest_filename, 'w')
    indent_ch = '\t'
    curr_level = 1
    out_file.write('{\n')
    
    with open(src_filename, 'r') as f:
        for line in f.readlines():
            if line.strip().startswith('//'):
                continue # Skip comments.

            level = line.find('"') + 1

            if level < 1:
                continue # Skip lines without tokens.

            values = ['"' + v + '"' for v in split(line)]
            indent = indent_ch * level

            if level != curr_level:
                delta = curr_level - level
                curr_level = level

                if delta > 0:
                    for i in range(delta, 0, -1):
                        out_file.write('\n' + (indent_ch * (level + i - 1)) + '}')
                        if i == 1:
                            out_file.write(',')
                    out_file.write('\n')

            elif level == curr_level and level > 1: 
                out_file.write(',\n')

            if len(values) == 1:
                out_file.write(indent + values[0] + ' : {\n')
            else:
                out_file.write(indent + ' : '.join(values))

        for i in range(curr_level, 0, -1):
            out_file.write('\n' + (indent_ch * (level + i - 1)) + '}')

    out_file.close()

if __name__ == '__main__':
    parser = ArgumentParser()
    parser.add_argument('-s', '--src', default=DEFAULT_CONFIG_FILE, help="config file")
    parser.add_argument('dest', help="file where the parsed JSON will be written to")
    args = parser.parse_args()

    parseConfig(args.src, args.dest)

补充笔记

似乎有一个用 Java 编写的 CS:GO 配置解析器,它使用 Antlr 语法来解析文件。

GitHub项目链接:https://github.com/valx76/CSGO-Config-Parser

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Python 中解析 CS:GO 脚本文件 的相关文章

随机推荐

  • Codeigniter图片上传mysql

    我想知道如果我将 CodeIgniter 中的图像上传到数据库 我的结果是什么 config upload path 我见过的所有示例都使用文件系统 我在数据库中有文章 并且也想在数据库中存储与文章相关的图像 有人可以帮忙吗 你可以阅读这篇
  • PHP 和 mssql 库可以从 varchar 列中选择超过 256 个字符吗?

    是否有解决方法 除了将列类型更改为文本字段之外 使用 PHP 和 mssql 库选择大型 varchar 字段 例如 varchar 500 PHP 真的将字符数限制为 255 吗 还有比这更拉回来的方法吗 从PHP页面来看 问题似乎出在W
  • 有没有什么方法可以只使用 CSS 来获得倾斜的盒子阴影?

    我想要类似徽标的东西CSS 技巧 但使用 CSS 而不是图像文件 因此可以调整其大小 这可能吗 像这样的图片 纯 CSS 带切角的倾斜阴影 这花了一点时间来完善 但现在横幅下有一个倾斜的阴影 也有切角和多个边框 所有效果 包括背景 徽标和阴
  • 使用自定义选择器和逻辑进行 JQuery 验证

    是否可以将 JQuery Validate 与自定义选择器和验证逻辑一起使用 大致如下 myForm validate rules myattr foo function content return content val contain
  • CLR 在运行时使用的 dll

    我有一个引用 NET DLL 的 C 应用程序 如果这个 DLL 存在于我的应用程序中bin目录和 GAC 然后 CLR 在运行时会选择哪一个 如果 GAC 有最新版本 是否会使用该版本而不是bin 我如何强制 CLR 始终使用我的 CLR
  • 无法阻止被动事件侦听器内的默认行为

    我在用着Framework7 可排序列表它运行良好 只是当列表更改时它不会触发事件 所以我正在尝试一些内置事件 sortable handler on touchstart function e e preventDefault alert
  • FlashDevelop、Haxe 导入 CreateJS?

    我刚刚开始尝试 Haxe 制作一个网络应用程序 我想使用 CreateJS 它有一个 Haxe extern lib 东西 我使用 FlashDevelop 作为我的 IDE 所以我在FlashDevelop中创建了一个新的Haxe JS项
  • 从 jquery ui datepicker maxDate 选项获取日期对象

    通过使用以下 var maxDate selector datepicker option maxDate 输出可以是 1M 20Y 12 12 2013 或更多的任何内容 1M 和 20Y 示例是否可以与本机 JavaScript 一起使
  • Actionscript 3:self 事件侦听器是否会阻止对象被垃圾回收?

    我知道事件侦听器和对对象的引用将阻止垃圾收集器处理对象 我的问题是 放置在对象上的事件侦听器侦听同一对象是否会阻止该对象被垃圾收集 我问是因为这似乎发生在我身上 我正在破坏对某个对象的所有引用 但当其计时器关闭时我仍然看到痕迹 同时 这似乎
  • 如何使用 Angular CLI 安装特定版本的 Angular?

    我搜索了 google 和 Angular cli 文档 但找不到任何使用 Angular CLI 安装特定版本 Angular 的方法 有可能吗 为了回答您的问题 我们假设您对特定的感兴趣angular版本而不是特定的角度 cli版本 A
  • 如何解决MongoDB实例化失败的问题[关闭]

    Closed 这个问题需要调试细节 目前不接受答案 我关注了 MongoDbDocs设置我的第一个 MongoDb 当我使用命令启动 MongoDB 时 C Program Files MongoDB Server 3 4 bin mong
  • jpeg 的有效 base64 字符串

    这是有效的 jpeg base64 字符串吗 data image jpeg base64 9j 4AAQSkZJRgABAQAAAQABAAD 2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgk
  • 如何使 JFrame 内的 JPanel 填充整个窗口?

    在下面的示例中 如何让 JPanel 占用所有 JFrame 我将首选尺寸设置为 800x420 但实际上只填充了 792x391 import java awt Color import java awt Dimension import
  • 带单选按钮的 Android 颜色选择器

    我想创建一组单选按钮来选择颜色 像这样的东西 我怎样才能实现这样的目标 我在原始 RadioButton 上没有找到任何颜色属性 我必须创建自定义控件吗 如果是 有人可以提示我基本步骤 以便我可以尝试一些新的研究吗 我对 Android 很
  • 如果连续行之间的差异满足条件,则计算列的总和

    这是帖子中的一个持续问题如果第二行满足条件 则从每组中删除第一行 下面是一个示例数据集 df lt data frame id c 9 9 9 5 5 4 4 4 4 4 20 20 Date c 11 29 2018 11 29 2018
  • Oracle触发器更新同一个表

    我有一个触发器 我试图用它来更新它侦听的同一个表 但是 在提交创建或更新后 我收到以下错误 ORA 04091 table username ADDRESSES is mutating trigger function may not se
  • 无法保留 DStream 以供下一批使用

    JavaRDD
  • C# 和 Java 之间的 Base64 区别

    image是图像文件的字符串 我的 C 代码如下 Convert ToBase64String image 并用Java编写代码如下 org apache commons codec binary Base64 encodeBase64 i
  • 在 R 中的所有列名称中替换多个句点[重复]

    这个问题在这里已经有答案了 我有以下数据框 df data frame a dfs 56 c rep a 8 rep b 5 rep c 7 rep d 10 b fqh 28 rnorm 30 6 2 c 34 2 fgs rnorm 3
  • 在 Python 中解析 CS:GO 脚本文件

    我正在使用 CS GO 中的一些脚本文件 我必须从该文件中获取一些有用的信息并将这些数据导入到我的 python 应用程序中 以下是txt数据格式的示例 https steamcdn a akamaihd net apps 730 scri