Python 有没有办法从文件中提取文本并从中生成词典?
所以我有一个文件: 狗[‘吠叫’、‘吃’、‘飞’] 猫[‘喵’、‘吃’、‘飞’] 它们之间有2个'\n'。我需要把它们提取出来并转换成字典。 当我试图使用readlines从中读取文本时,我会得到如下项目列表: “狗[‘吠叫’、‘吃’、‘飞’]\n”、“\n”、“猫[‘喵喵’、‘吃’、‘飞’]\n”、“\n”]Python 有没有办法从文件中提取文本并从中生成词典?,python,dictionary,Python,Dictionary,所以我有一个文件: 狗[‘吠叫’、‘吃’、‘飞’] 猫[‘喵’、‘吃’、‘飞’] 它们之间有2个'\n'。我需要把它们提取出来并转换成字典。 当我试图使用readlines从中读取文本时,我会得到如下项目列表: “狗[‘吠叫’、‘吃’、‘飞’]\n”、“\n”、“猫[‘喵喵’、‘吃’、‘飞’]\n”、“\n”] 我想买一本这样的字典。。。动物[狗]=“吠叫”,“吃”,“飞”,猫也是如此。我应该用什么`也许可以把它们分开或其他任何东西。这里有一个简单的解决方案。它需要一些字符串操作,但我认为它应该
我想买一本这样的字典。。。动物[狗]=“吠叫”,“吃”,“飞”,猫也是如此。我应该用什么`也许可以把它们分开或其他任何东西。这里有一个简单的解决方案。它需要一些字符串操作,但我认为它应该适合您的需要
animals = {}
with open("file.txt") as file_in:
lines = []
for line in file_in:
if (line != "\n"):
key = line.rstrip().split('[')[0]
val = (line.rstrip().split('[')[1][:-1]).replace("'", "").replace(" ", "").split(',')
animals[key] = val
print(animals)
首先,我们需要将字符串转换为更好的格式:
animalValues=[“狗['bark'、'eat'、'fly']\n”、'\n'、“猫['meow'、'eat'、'fly']\n”、'\n']
animalValues=[i.replace(“\n”,”),如果i!=“\n”]
然后,我们将列表转换为dict:
animalDict={i.split(“[”[0]:[p.replace(“”,”)表示i.split(“[”[1])。split(“]”[0]。split(“,”)表示i在animalValues}
这里有一个使用正则表达式的解决方案:
import json
import re
s = '''Dog['bark','eat','fly']
Cat['meow', 'eat ', 'fly']'''
dictionary = {}
for line in s.split('\n'):
if line:
search = re.search('^([a-zA-Z]+)(\[.+\])$', line, re.IGNORECASE)
if search:
key, arr = search.groups()
dictionary[key] = json.loads(arr.replace('\'', '"'))
print(dictionary)
输出:
{'Cat': ['meow', 'eat ', 'fly'], 'Dog': ['bark', 'eat', 'fly']}
对于更健壮的解决方案,由于输入实际上是有效的Python代码,并且有几个命名对象被元组分割,因此可以使用
ast.parse
将输入解析为ast节点,并像下面这样迭代名称元组对:
import ast
s = '''Dog['bark','eat','fly']
Cat['meow', 'eat ', 'fly']'''
{n.value.value.id: [i.value for i in n.value.slice.value.elts] for n in ast.parse(s).body}
这将返回:
{'Dog': ['bark', 'eat', 'fly'], 'Cat': ['meow', 'eat ', 'fly']}
你能发布你尝试过的吗?用open('input.txt','r')作为文件:text=file.readlines()text.replace('\n',''),我坚持这一点。在这种情况下,也许我应该使用正则表达式?这里不需要使用
ast.literal\u eval
。你可以通过replace函数删除
。
{'Dog': ['bark', 'eat', 'fly'], 'Cat': ['meow', 'eat ', 'fly']}