use*_*351 1 python text python-2.7 python-3.x
所以我正在制作一个Yu-Gi-Oh数据库程序.我将所有信息存储在一个大文本文件中.每个怪物都通过以下方式进行了分类:
|Name|NUM 1|DESC 1|TYPE|LOCATION|STARS|ATK|DEF|DESCRIPTION
Run Code Online (Sandbox Code Playgroud)
这是一个实际的例子:
|A Feather of the Phoenix|37;29;18|FET;YSDS;CP03|Spell Card}Spell||||Discard 1 card. Select from your Graveyard and return it to the top of your Deck.|
Run Code Online (Sandbox Code Playgroud)
所以我创建了一个程序,按名称搜索这个大文本文件,它返回文本文件中没有'|'的信息.这里是:
with open('TEXT.txt') as fd:
input=[x.strip('|').split('|') for x in fd.readlines()]
to_search={x[0]:x for x in input}
print('\n'.join(to_search[name]))
Run Code Online (Sandbox Code Playgroud)
现在我正在尝试编辑我的程序,以便我可以搜索怪物的名称并选择我想要显示的属性.所以它看起来像
A Feather of the Phoenix
Description:
Discard 1 card. Select from your Graveyard and return it to the top of your Deck.
Run Code Online (Sandbox Code Playgroud)
关于我如何做到这一点的任何线索?
首先,这是CSV的变体方言,可以使用csv模块进行解析,而不是尝试手动执行.例如:
with open('TEXT.txt') as fd:
rows = csv.reader(fd, delimiter='|')
to_search = {row[1]:row for row in rows}
print('\n'.join(to_search[name]))
Run Code Online (Sandbox Code Playgroud)
您可能也更喜欢使用DictReader,因此每行都是a dict(键入标题行中的名称,如果没有,则为手动指定的列名称):
with open('TEXT.txt') as fd:
rows = csv.DictReader(fd, delimiter='|')
to_search = {row['Name']:row for row in rows}
print('\n'.join(to_search[name]))
Run Code Online (Sandbox Code Playgroud)
然后,选择一个特定的属性:
with open('TEXT.txt') as fd:
rows = csv.DictReader(fd, delimiter='|')
to_search = {row['Name']:row for row in rows}
print(to_search[name][attribute])
Run Code Online (Sandbox Code Playgroud)
但是......我不确定这是一个好的设计.你真的想为每次查找重新读取整个文件吗?我认为将它一次读入内存更有意义,将其转换为可以重复使用的通用结构.事实上,你几乎有这样的结构:
with open('TEXT.txt') as fd:
monsters = list(csv.DictReader(fd, delimiter='|'))
monsters_by_name = {monster['Name']: monster for monster in monsters}
Run Code Online (Sandbox Code Playgroud)
然后,如果需要,您可以构建其他索引,例如按位置等的多个怪物地图.
说了这么多,你的原始代码几乎可以处理你想要的东西.to_search[name]是一个list.如果您只是从属性名称到索引构建映射,则可以执行以下操作:
attributes = ['Name', 'NUM 1', 'DESC 1', 'TYPE', 'LOCATION', 'STARS', 'ATK', 'DEF', 'DESCRIPTION']
attributes_by_name = {value: idx for idx, value in enumerate(attributes)}
# ...
with open('TEXT.txt') as fd:
input=[x.strip('|').split('|') for x in fd.readlines()]
to_search={x[0]:x for x in input}
attribute_index = attributes_by_name[attributes]
print(to_search[name][attribute_index])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1282 次 |
| 最近记录: |