将键复制到新字典(Python)
我正在读取一个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])