我有一个我想要解析为Dict的CSV文件,因此可以将带有“key”键的第一项解压缩到变量,然后将其余值作为键控语言列表。这样做有一个很好的,干净的方式吗?
我的CSV就像这样:
key,english,spanish
wanna_play_a_game,"Wanna play a game?","¿Quiero jugar a un juego?"
something_else,"Hello!","hola!"
Dict对象:
[{'key': 'wanna_play_a_game', 'english': 'Wanna play a game?', 'spanish': '¿Quiero jugar a un juego?'}, {'key': 'something_else', 'english': 'Hello', 'spanish': 'hola!'}]
我确实有一个去,但后来意识到解包与dicts(我假设)不一样,因为它们不像列表那样排序。我是否过于复杂,应该将row['key']
保存到变量中,然后将其从dict中删除? Python不是我的面包&黄油语言所以我对语法中更加狂热的部分并不了解。
在我意识到自己迷失之前,这就是我所得到的:
import csv
class Translate:
def __init__(self):
self.translations = self.readCSV('translations.csv')
def readCSV(self, filename):
with open(filename, 'rt') as csvfile:
reader = csv.DictReader(csvfile)
return [dict(d) for d in reader]
def parse(self, line):
# for t_key, *langs in self.translations:
# for k, (t_key, *langs) in self.translations:
# ... some magic function?
我想要获得的基本信息是t_key
为"wanna_play_a_game"
而langs
为('english': 'Wanna play a game?', 'spanish': '¿Quiero jugar a un juego?')
答案 0 :(得分:1)
拆包不是你想要的。你应该从dict弹出t_key
,然后迭代其余部分。
t_key = langs.pop('key')
for key, value in langs.items():
...
答案 1 :(得分:1)
您的问题标记为Python 3.6,而在3.6中,DictReader
会返回OrderedDict
个实例,因此如果您只是将return [dict(d) for d in reader]
更改为return list(reader)
,则解压缩实际上不应该是一个问题},否则您将这些OrderedDict
转换回常规无序dict
。
使用online interactive Python shell进行测试,因为我在这里遇到了3.5:
>>> text = '''key,english,spanish
... wanna_play_a_game,"Wanna play a game?","¿Quiero jugar a un juego?"
... something_else,"Hello!","hola!"'''
>>> r = csv.DictReader(io.StringIO(text))
>>> ds = list(r)
>>> key, eng, esp = ds[0].values()
>>> key, eng, esp
('wanna_play_a_game', 'Wanna play a game?', '¿Quiero jugar a un juego?')
或者,如果语言数量未知,*
将解压缩到列表:
>>> key, *langs = ds[1].values()
>>> key, langs
('something_else', ['Hello!', 'hola!'])
在你的情况下,你可能需要这个(还记得return list(reader)
):
for d in self.translations:
key, *langs = d.values()
# do stuff with key and langs
或者,您也可以使用dict-comprehension创建一个字典,将"key"
键的值映射到不同语言的OrderedDict
翻译:
>>> {d.pop("key"): d for d in ds}
{'wanna_play_a_game': OrderedDict([('english', 'Wanna play a game?'), ('spanish', '¿Quiero jugar a un juego?')]),
'something_else': OrderedDict([('english', 'Hello!'), ('spanish', 'hola!')])}
但请注意,当您创建字典理解时,此会修改列表中的dicts,这可能被认为是不好的做法,但在这种情况下,并考虑到您没有保留引用首先,我认为这可以使用。
答案 2 :(得分:-3)
您可以使用split()方法尝试这样的事情:
final_list=[]
with open('file.txt','r') as f:
for line_no,data in enumerate(f):
if line_no==0:
pass
else:
dict_1 = {}
key,english,spanish=data.split(',')
dict_1['key'] = key
dict_1['English'] = english
dict_1['Spanish']=spanish.strip('\n')
final_list.append(dict_1)
print(final_list)
输出:
[{'English': '"Wanna play a game?"', 'key': 'wanna_play_a_game', 'Spanish': '"¿Quiero jugar a un juego?"'}, {'English': '"Hello!"', 'key': 'something_else', 'Spanish': '"hola!"'}]