将键复制到新字典(Python)

29 投票
4 回答
49712 浏览
提问于 2025-04-17 01:57

我正在读取一个csv文件,使用的是DictReader()。这个函数会返回一个字典,字典的键是表头的项,而单元格的内容则是值。挺不错的。

不过,我想处理一些数据可能不符合我预期的行。在这种情况下(我正在捕捉一个ValueError异常),我希望把那些“可疑”的行放到一个单独的字典里,以便手动处理。

我的问题是:因为我第一个字典(DictReader返回的对象)里的所有键都设置得很好,我该如何把仅仅是键复制到我的第二个字典里,这个字典只想存放可疑的行,方便手动处理呢?

我尝试过使用dict.fromkeys()之类的方法,但一直没有成功。求助!

编辑:贴出一些我错误的代码。我要躲起来为我的代码感到羞愧。别评判我!;-)

unsure_rows = dict.fromkeys(dict(csv_reader).keys(), [])
for row in csv_reader:
#   if row['Start Time'] != 'None':
    try:
        if before_date > strptime(row['Start Time'], '%Y-%m-%d %H:%M:%S') > after_date:
            continue
    except ValueError:
        unsure_rows += row

ValueError: 字典更新序列元素 #0 的长度是 13;需要 2

4 个回答

1

你可能不想把“仅仅是键”复制到另一个字典里,但如果你只有“键”,那么你就会得到一个集合

要从字典d中获取键,你只需要使用d.keys()

这会返回一个列表(里面的键顺序是随机的),你可以把它保留为列表,或者用下面的方式复制到一个集合里:

set(d.keys())

举个例子:

>>> d = {'one': 1, 'three': 3, 'two': 2, 'four': 4} 
>>> set(d.keys())
set(['four', 'one', 'three', 'two'])

编辑:

现在我明白你是想在捕获异常时记录可疑的键值对。在这种情况下,你可以先从一个空字典开始。

suspect = {}

然后在你的代码中,我想这可能是某种循环,像这样添加可疑的键值对:

while something():
    k, v = generate_pair()
    try:
        analyze_something_with_k_and_v_that_might_throw_an_exception
        add_it_to_regular_dict
    except:
        suspect[k] = v
9

你试过这样做吗:

newd = dict.fromkeys(origdict)

如果这样还是不行,那请告诉我你遇到的错误的更多细节。

35

你快到了。试试这个:

dict.fromkeys(my_csv_dict.keys(),[])

这个代码会创建一个字典,里面的键和你从CSV文件中提取的一样,每个键都对应一个空列表(我想你是打算把可疑的行值添加到这个列表里)。


试试这个。这里有一些更细微的变化都是必要的,比如在开始读取CSV之前,你不能先初始化 unsure_rows。

unsure_rows = None
for row in csv_reader:
#   if row['Start Time'] != 'None':
    try:
        if before_date > strptime(row['Start Time'], '%Y-%m-%d %H:%M:%S') > after_date:
            continue
    except ValueError:
        if not unsure_rows:
            # Initialize the unsure rows dictionary
            unsure_rows = dict.fromkeys(csv_reader.fieldnames,[])
        for key in unsure_rows:
            unsure_rows[key].append(row[key])

撰写回答