我的问题是我想读取一个有多行的文件,例如:
be:was, were
I:you
Tom
现在我想把第一个元素(在":"之前(变成dict的键,把":"之后的所有元素都变成一个列表。每个列表条目都用","分隔
所以它应该是这样的:
words_dict = {"be" : ["was", "were"], "I" : ["you"], "Tom" : []}
我想出了这样的东西:
with open(words, 'r') as file:
for line in file:
words = line.strip().split(':')
我不知道这是否是正确的方法,也不知道下一步该怎么做。
也许是类似的东西
with open(words, 'r') as file:
for line in file.readlines(1024):
split = line.removesuffix('n').split(':', maxsplit=1)
if len(split) == 2:
vals = [val.strip() for val in split[1].split(',')]
else: # : not found in line
vals = []
d[split[0]] = vals
如果你能清理数据,总是保证密钥后面有一个:
,那么循环就可以大大简化;
with open(words, 'r') as file:
for line in file.readlines(1024):
key, value = line.removesuffix('n').split(':', maxsplit=1)
d[key] = [val.strip() for val in value.split(',')]
您应该首先用':'
分割这一行,以获得键和字符串的其余部分(如果有(,它们稍后将成为值。然后使用','
拆分这些值,如果剥离后这些值不为空,则对其进行过滤。
试试这个:
d = {}
with open(words) as f:
for line in f:
key, *values = line.strip().split(':', maxsplit=1)
values = ''.join(values)
values = [w for word in values.split(',') if (w := word.strip())]
d[key] = values
print(d)
输出:
{'be': ['was', 'were'], 'I': ['you'], 'Tom': []}
注意,这是因为:首先;加入";方法不会为空的可迭代项引发异常,second,"分割";也不会抱怨空字符串。
您应该能够使用字典理解:
with open(words, 'r') as file:
words = {(l:=s.rstrip('n').split(':'))[0]:l[1].split(', ') if len(l)>1 else []
for s in file}
一个简短的解决方案:
data = {}
with open('words.txt', 'r') as file:
for line in file.readlines():
key, *value = line.strip().split(':')
data[key] = list(filter(None, [i.strip() for i in ','.join(value).split(',')]))
print(data)
输出:
{'be': ['was', 'were'], 'I': ['you'], 'Tom': []}