论证用Dict打开包装

时间:2017-12-07 16:38:17

标签: python python-3.6

我有一个我想要解析为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?')

3 个答案:

答案 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!"'}]