在Python中存储字符串的好办法是什么?

5 投票
2 回答
6235 浏览
提问于 2025-04-17 21:28

我正在用Python制作一个对话机器人。虽然我希望尽可能多地从头开始生成文本,但我还是需要一种方法来整理和存储一堆对话片段字符串。理想情况下,我想在这些字符串之间建立某种层级或分类。

比如说:

问候语:

"哦,很高兴见到你{0}" "我叫鲍勃,你呢?"

调情:

"别这样" "我在脸红" "真会说话"

等等……

虽然我可以把这些存储在数据库里,但如果有一种不同的格式,让人们可以轻松手动编辑就好了。比如CSV格式?JSON格式?有没有类似的先例呢?

2 个回答

3

这要看你想存储多少信息了。

如果只是简单的情况,比如“数据库”只是一个字符串的列表,你可以用纯文本来存储,每行一个字符串。这样做的好处是,纯文本文件很容易用很多工具来搜索、编辑和处理,比如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"
10

这要看你想怎么使用这些字符串。如果这些字符串只是给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等格式,你可以把数据分成不同的类别,比如“问候”、“告别”等等。

别忘了,由于你有很多选择,最好是把代码写得模块化和解耦。这样,如果你做了某个决定,未来需要更改时,就能尽量无缝地完成。

希望这些对你有帮助!

撰写回答