我正在使用DictReader()读取csv文件。该函数返回一个字典,其中标题项是键,单元格是值。很酷。
但我正在尝试考虑数据可能与我预期不同的行。在那种情况下(我正在捕获一个ValueError异常),我希望那些“可疑”的行进入一个单独的字典,进行手动处理。
我的问题是:因为我的第一本字典(DictReader返回的对象)已正确设置了所有键,如何将只是键复制到我的第二本字典中,我想成为一个可疑行的字典,需要手动处理吗?
我一直在玩dict.fromkeys()这样一段时间了,而我现在还没到任何地方。 HALP!
编辑:粘贴我的一些错误代码。要躲在我的代码的耻辱中去。不要评判我! ; - )
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是必需的
答案 0 :(得分:16)
你很亲密。尝试:
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])
答案 1 :(得分:4)
你试过了吗?
newd = dict.fromkeys(origdict)
?如果这对您不起作用,请添加有关您所遇到的错误的更多详细信息。
答案 2 :(得分:0)
您不希望将“只是密钥”复制到另一个字典中,但如果您只有“密钥”,则会有设置。
要从dict 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