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

在Python中解析CS:GO脚本文件,python,parsing,format,Python,Parsing,Format,我正在使用CS:GO中的一些脚本文件,我必须从这个文件中获得一些有用的信息,并将这些数据导入到我的python应用程序中 以下是txt数据格式的示例: 值是随机格式(Color\Pos\String),但我只需要一个字符串,它包含所有值。 我需要将这些信息输入字典,例如: print(global_dict['items_game']['game_info']['first_valid_class']) <<2 print(全局目录['items\u game']['game\u

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

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

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

print(global_dict['items_game']['game_info']['first_valid_class'])
<<2
print(全局目录['items\u game']['game\u info']['first\u valid\u class']))

下面是一个基于pyparsing的解析器,它将解析此格式:

from pyparsing import Suppress, QuotedString, Forward, Group, Dict, ZeroOrMore

LBRACE,RBRACE = map(Suppress, "{}")
qs = QuotedString('"')

# forward-declare value, since this expression will be recursive
# (will contain expressions which use contain value's)
value = Forward()

key_value = Group(qs + value)
struct = LBRACE + Dict(ZeroOrMore(key_value)) + RBRACE

# define content of value using <<= operator
value <<= qs | struct

# define top-level parser
parser = Dict(key_value)
印刷品:

['items_game']
- sticker_kits
- client_loot_lists
- prefabs
- quest_definitions
- alternate_icons2
- music_definitions
- rarities
- colors
- campaign_definitions
- player_loadout_slots
- quest_schedule
- item_levels
- revolving_loot_lists
- game_info
- pro_players
- recipes
- items_game_live
- paint_kits_rarity
- paint_kits
- qualities
- items
- attributes
- item_sets
- quest_reward_loot_lists
- kill_eater_score_types

[['game_info',
  ['first_valid_class', '2'],
  ['last_valid_class', '3'],
  ['first_valid_item_slot', '0'],
  ['last_valid_item_slot', '54'],
  ['num_item_presets', '4']],
 ['rarities',
  ['default',
   ['value', '0'],
... etc. ...
编辑

如果希望在解析时将整数值转换为整数,可以定义解析操作来完成此操作。但是你只想把它(我想)附加到带引号的字符串上,这些字符串是值,而不是键

# use this code to convert integer values to ints at parse time
key_qs = qs.copy()
value_qs = qs.copy()
def convert_integers(tokens):
    if tokens[0].isdigit():
        tokens[0] = int(tokens[0])
value_qs.setParseAction(convert_integers)

value = Forward()
key_value = Group(key_qs + value)
struct = LBRACE + Dict(ZeroOrMore(key_value)) + RBRACE
value <<= value_qs | struct
parser = Dict(key_value)

请注意,整数值不再显示为字符串,而是显示为实际的Python int。

这里是一个基于pyparsing的解析器,它将解析此格式:

from pyparsing import Suppress, QuotedString, Forward, Group, Dict, ZeroOrMore

LBRACE,RBRACE = map(Suppress, "{}")
qs = QuotedString('"')

# forward-declare value, since this expression will be recursive
# (will contain expressions which use contain value's)
value = Forward()

key_value = Group(qs + value)
struct = LBRACE + Dict(ZeroOrMore(key_value)) + RBRACE

# define content of value using <<= operator
value <<= qs | struct

# define top-level parser
parser = Dict(key_value)
印刷品:

['items_game']
- sticker_kits
- client_loot_lists
- prefabs
- quest_definitions
- alternate_icons2
- music_definitions
- rarities
- colors
- campaign_definitions
- player_loadout_slots
- quest_schedule
- item_levels
- revolving_loot_lists
- game_info
- pro_players
- recipes
- items_game_live
- paint_kits_rarity
- paint_kits
- qualities
- items
- attributes
- item_sets
- quest_reward_loot_lists
- kill_eater_score_types

[['game_info',
  ['first_valid_class', '2'],
  ['last_valid_class', '3'],
  ['first_valid_item_slot', '0'],
  ['last_valid_item_slot', '54'],
  ['num_item_presets', '4']],
 ['rarities',
  ['default',
   ['value', '0'],
... etc. ...
编辑

如果希望在解析时将整数值转换为整数,可以定义解析操作来完成此操作。但是你只想把它(我想)附加到带引号的字符串上,这些字符串是值,而不是键

# use this code to convert integer values to ints at parse time
key_qs = qs.copy()
value_qs = qs.copy()
def convert_integers(tokens):
    if tokens[0].isdigit():
        tokens[0] = int(tokens[0])
value_qs.setParseAction(convert_integers)

value = Forward()
key_value = Group(key_qs + value)
struct = LBRACE + Dict(ZeroOrMore(key_value)) + RBRACE
value <<= value_qs | struct
parser = Dict(key_value)
请注意,整数值不再显示为字符串,而是显示为实际的Python int。

如前所述,该文件几乎是JSON

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

我甚至使用测试了输出,并成功验证了文件

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

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


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

$ConfigParser.py-h
用法:ConfigParser.py[-h][s SRC]dest
位置参数:
dest文件,解析后的JSON将写入其中
可选参数:
-h、 --帮助显示此帮助消息并退出
-s SRC,--SRC SRC源配置文件
#/usr/bin/env蟒蛇3
“”“ConfigParser.py:解析阀门配置文件。
CS:GO游戏项目的配置文件逐行读取
并写入输出文件。添加缺少的冒号和逗号
输出文件通过了JSLint验证。
"""
从argparse导入ArgumentParser
从shlex导入拆分
__作者=“Polywhill先生”
__版权所有=“版权所有2016,堆栈溢出”
__学分=[]
__许可证\=“GPLv3”
__版本\=“1.1.0”
__维护人员\=“Polywhill先生”
__电子邮件\ \“https://stackoverflow.com/users/1762224"
__状态=“生产”
#这是解析的默认文件。
默认配置文件='C:/ProgramFiles(x86)/Steam/steamapps/common/\
反击全球进攻/csgo/scripts/items/items\u game.txt'
def parseConfig(src_文件名,dest_文件名):
out\u file=open(dest\u文件名'w')
缩进\u ch='\t'
当前级别=1
out\u file.write(“{\n”)
将open(src_文件名,'r')作为f:
对于f.readlines()中的行:
如果line.strip().startswith('/'):
继续#跳过评论。
级别=行。查找(“”)+1
如果级别<1:
继续#跳过不带标记的行。
值=['“+v+'”,用于拆分中的v(行)]
缩进=缩进*级别
如果级别!=当前级别:
增量=当前水平-水平
当前水平=水平
如果增量>0:
对于范围内的i(增量,0,-1):
out_file.write('\n'+(缩进_ch*(级别+i-1))+'}'))
如果i==1:
out_file.write(“,”)
out\u file.write('\n')
elif级别==当前级别和级别>1:
out\u file.write(',\n')
如果len(值)==1:
out_file.write(缩进+值[0]+':{\n')
其他:
out_file.write(缩进+“:”.join(值))
对于范围内的i(当前级别,0,-1):
out_file.write('\n'+(缩进_ch*(级别+i-1))+'}'))
out_file.close()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
parser=ArgumentParser()
add_参数('-s','-src',default=default_CONFIG_FILE,help=“CONFIG FILE”)
parser.add_参数('dest',help=“解析后的JSON将写入的文件”)
args=parser.parse_args()
parseConfig(args.src、args.dest)

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

GitHub项目链接:

正如所指出的,该文件几乎是JSON

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

我甚至使用测试了输出,并成功验证了文件

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

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


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

$ConfigParser.py-h
用法:ConfigParser.py[-h][s SRC]dest
位置参数:
dest文件,解析后的JSON将写入其中
可选参数:
-h、 --帮助显示此帮助消息并退出
-s SRC,--SRC SRC源配置文件
!/usr/bin/env python3
“”“ConfigParser.py:解析阀门配置文件。
CS:GO游戏项目的配置文件逐行读取
并写入输出文件。添加缺少的冒号和逗号
去他们合适的地方。输出文件通过了JSLint验证。
"""
来自arg