在Python中存储字符串的好办法是什么?
我正在用Python制作一个对话机器人。虽然我希望尽可能多地从头开始生成文本,但我还是需要一种方法来整理和存储一堆对话片段字符串。理想情况下,我想在这些字符串之间建立某种层级或分类。
比如说:
问候语:
"哦,很高兴见到你{0}"
"我叫鲍勃,你呢?"
调情:
"别这样"
"我在脸红"
"真会说话"
等等……
虽然我可以把这些存储在数据库里,但如果有一种不同的格式,让人们可以轻松手动编辑就好了。比如CSV格式?JSON格式?有没有类似的先例呢?
2 个回答
这要看你想存储多少信息了。
如果只是简单的情况,比如“数据库”只是一个字符串的列表,你可以用纯文本来存储,每行一个字符串。这样做的好处是,纯文本文件很容易用很多工具来搜索、编辑和处理,比如GNU核心工具(像grep、sed等)或者图形界面的编辑器。
而且,你还可以通过预先定义的文件命名和目录结构来轻松扩展。例如,像下面这样的结构:
data/
data/en_GB/greetings
data/en_GB/farewells
data/en_US/greetings
data/en_US/farewells
data/de_DE/greetings
data/de_DE/farewells
可以让你按语言来选择数据,甚至在某些系统上只部署相关的语言。
如果你唯一的问题是换行符,你可以继续使用上面的方法,再加上某种垂直分隔符,比如~~~~
。
不过,如果你打算使用稍微复杂一点的结构,或者预期这些结构会变化,那么使用完整的序列化/标记语言会更有意义。我个人比较喜欢的是YAML,它功能丰富、成熟,并且在主要编程语言中都有库支持,易于理解和编辑(看看他们的网站:就是用YAML写的!)。
# you can have comments for editors in YAML
# informal greetings are allowed
greetings:
- "hello {0}"
- "what's up {0}"
# bye, etc.
farewells:
- "see you soon {0}"
- "nos vemos {0}"
# please be polite here
flirtation:
- "Stop it"
- "I'm blushing"
- "How flattering"
这要看你想怎么使用这些字符串。如果这些字符串只是给Python用的话,你可以考虑把它们放在一个自己的.py
文件里。没错,这就是一个模块,但其实它也只是一个简单的文本文件,刚好可以被Python理解 :)
很多项目会把.py
文件当作配置文件来用(比如Django),导入里面的内容也非常简单,只需要写import answer_strings
,你就能把它们放到变量或类里使用了。
比如你可以这样做:
#bot answers module
greetings = ["hello {0}", "what's up {0}"]
farewells = ["see you soon {0}", "nos vemos {0}"]
...
这样可以随机返回相应的答案等等。
另一方面,如果这些字符串还需要被JavaScript、Java、node.js或者其他任何非Python的技术读取,那就应该使用更通用的格式,比如JSON、XML、YAML等等。
我觉得把这些放在文本文件里(作为项目的资源)比放在数据库里要好,因为这样(正如你提到的)更灵活。而且我还建议使用一种包含语义的格式。CSV文件在我看来是非常冷冰冰的,只是一堆数据被扔到文件里。而用XML、JSON等格式,你可以把数据分成不同的类别,比如“问候”、“告别”等等。
别忘了,由于你有很多选择,最好是把代码写得模块化和解耦。这样,如果你做了某个决定,未来需要更改时,就能尽量无缝地完成。
希望这些对你有帮助!