我有一个文本文件,看起来像这样:
word1 4
wöörd2 8
word3 12
word4 5
another word 1
many words one after another 1
word5 9
如果不是因为有很多单词的行,下面的代码可以工作:
f = open("C:\path\words.txt", 'r', encoding="utf-8")
dict = {}
for line in f:
k, v = line.strip().split()
dict[k.strip()] = v.strip()
f.close()
但显然在上面的情况下,我得到ValueError: too many values to unpack (expected 2)
。我假设有三个选项:
- 从文本文件中删除,这在一个巨大的文本文件中是很难手工完成的。
- 如果出现这种问题,则跳过行。
- 修改代码,使值始终是最后一个数字。
我发现3。对于一个大的、多样化的(就字符和单词而言)文件来说太令人生畏了(特别是因为我不太关心有问题的行)。但是对于2。,当我执行行分割时,我如何检查是否有超过2个元素?
不需要检查。用捕获异常:
with open("C:\path\words.txt") as f:
result = {}
for line in f:
try:
k, v = line.split()
except ValueError:
pass
else:
result[k] = v
现在代码也将适用于空行,或者单词之间没有空格的行。
注意,我做了一些修改:
使用
with open(...) as f
保证f
将在块完成时关闭(无论发生什么)不要使用
dict
;这就是您现在要隐藏的内置类型。我用result
代替。当使用无参数的
中删除了前后空格。str.split()
时,不需要使用line.strip()
,v.strip()
或k.strip()
;后者已经从每个拆分结果:>>> " str.strip() t strips f all whitespace n".split() ['str.strip()', 'strips', 'all', 'whitespace']
您可以使用dict.update()
接受(key, value)
元组序列的事实使其更简洁:
with open("C:\path\words.txt") as f:
result = {}
for line in f:
try:
result.update([line.split()])
except ValueError:
pass
如果你只想问第2点,你可以这样做:
f = open("C:\path\words.txt", 'r', encoding="utf-8")
dict = {}
for line in f:
if len(line.strip().split()) == 2:
k, v = line.strip().split()
dict[k.strip()] = v.strip()
f.close()
如果你想知道3,并且你知道最后一项总是一个数字你可以像这样索引数组来获取最后一个元素:
f = open("C:\path\words.txt", 'r', encoding="utf-8")
dict = {}
for line in f:
if len(line.strip().split()) == 2:
k, v = line.strip().split()
dict[k.strip()] = v.strip()[-1]
f.close()
这取决于您想要做什么,但看起来您正在构建的字典总是将一行中的完整句子作为键,并将行尾的数字作为值。如果数字总是该行的最后一个元素,您可以这样做:
f = open("C:\path\words.txt", 'r', encoding="utf-8")
results = {}
for line in f:
# select everything except for the last element, the sentence
k = line[:-1].strip()
# select just the last element, the number
v = line[-1].strip()
results[k] = v
f.close()
编辑:最好不要使用dict这个词,因为这是python中的一个方法
你应该改变你的代码,从某种意义上说,从line.strip().split()
你没有得到回键和值,但一个列表。
f = open("C:\path\words.txt", 'r', encoding="utf-8")
dict = {}
for line in f:
splitted_line = line.strip().split()
if len(splitted_line) <= 2:
dict[splitted_line[0].strip()] = splitted_line[1].strip()
f.close()
现在,我要提到的是,如果你想包含超过1个单词和一个数字的行,你可以通过将单词与特殊字符(如_
)连接起来来实现这一点使用:
f = open("test.txt", 'r', encoding="utf-8")
dict = {}
for line in f:
splitted_line = line.strip().split()
if len(splitted_line) <= 2:
dict[splitted_line[0].strip()] = splitted_line[1].strip()
else:
dict['_'.join(splitted_line[:-1])] = splitted_line[-1]
f.close()