如何读取这个结构奇怪的文本文件中的特定数据?python
我一直在为反恐全球攻势游戏开发一个discord机器人,在我尝试扩大其功能时,我遇到了一些我以前从未见过的东西。在过去的4个小时里,我一直在寻找,但找不到任何足够近的相关信息来建立联系。 我在游戏中使用了这个插件,它在我的服务器目录中放置了一个文本文件,我将通过FTPing获得访问权限(我很容易就找到了这个部分)。 我确实有我的用户统计数据和即将出现的设置存储在一个json文件中,但这是我知道的一种格式,每当我运行一个命令时,这个文件都会由游戏服务器生成(在每个游戏结束时,我会用另一个插件自动执行),所以我无法控制更改格式 我想做什么: 从未知的结构化文本文件中读取特定的数据行,并在每次游戏结束后将其转换为字符串 我的代码(仅读取文本文件) 输出(与文本文件完全相同): 在需要这些信息之前,我将拥有他们的steam64ID(一大组数字),我将使用它在他们的discord帐户和游戏统计数据之间创建链接 我认为我唯一需要帮助的是弄清楚如何具体获得团队得分、用户死亡、死亡、伤害等信息如何读取这个结构奇怪的文本文件中的特定数据?python,python,discord.py,read-data,Python,Discord.py,Read Data,我一直在为反恐全球攻势游戏开发一个discord机器人,在我尝试扩大其功能时,我遇到了一些我以前从未见过的东西。在过去的4个小时里,我一直在寻找,但找不到任何足够近的相关信息来建立联系。 我在游戏中使用了这个插件,它在我的服务器目录中放置了一个文本文件,我将通过FTPing获得访问权限(我很容易就找到了这个部分)。 我确实有我的用户统计数据和即将出现的设置存储在一个json文件中,但这是我知道的一种格式,每当我运行一个命令时,这个文件都会由游戏服务器生成(在每个游戏结束时,我会用另一个插件自动
非常感谢你们的时间,掌握这一点知识将帮助我显著提高我的机器人。从我所看到的,一旦你进入map对象(花括号),你可以看到一个类似于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)
我根据您共享的文件数据编写了这段代码。如果文件具有不同的结构,则需要更改代码
当上述代码保存在robo.py模块中时,以REPL输出
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'}}]}
一旦有了对象,就可以相应地查询它。这似乎是一个
VDF
,我找到了一个Git存储库来处理这些文件。只是简单地看一下,我认为你是对的!我根本找不到关于它的任何东西,有一个自由的空间真的让我的生活更轻松。谢谢你的帮助!非常感谢您的详细回复。这正是我一直在寻找的,因为现在我可以像查询播放器配置文件一样查询数据!我很感激你花了这么多时间来帮助我,现在我可以玩这个游戏,学习如何自己制作一个lib,而不是依赖别人为我制作一个lib!
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)
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'}}]}