2016-02-21 41 views
0

我在想如果在读取文件时在for循环中添加字典是否有一种简单的方法。 我有一个file.txt,我想逐行读取它,然后将它们添加到字典中。 我尝试了下面,但无法实际添加所有行作为键:在同一字典中的值。读取文件时在循环中添加到字典中

content of file.txt 
name1:value1 
name2:value2 
name3:value3 


with open("file.txt", 'r') as fd: 
     for line in fd.readlines(): 
      d=dict([line.rstrip().split(":")]) 
      d.update(d) 

最后,我想我的字典里有这样的事情: d = { '名1': '值1', '名称2': '值', 'NAME3': '值3'}

任何帮助表示赞赏。

+0

你能提供一个来自txt文件的示例行吗? – TheLazyScripter

+0

对不起,没有看到第4行 – TheLazyScripter

+0

你有一些线条,但不是全部? 'dict'不允许重复的键,所以如果一个名字重复出现,旧的行会被覆盖。 – tdelaney

回答

2

在循环的每次迭代中,创建一个名为dictd,尝试用自己来更新它,然后将其丢弃。由于dict在初始化时接受一个序列,你可以一步

with open("file.txt", 'r') as fd: 
    d = dict(line.rstrip().split(":") for line in fd) 
3

您需要在循环外部声明该词典并在其中进行更新。这是一个范围问题。

d={} 
with open("file.txt", 'r') as fd: 
    for line in fd.readlines(): 
     d_tmp=dict([line.rstrip().split(":")]) 
     d.update(d_tmp) 
1

可能不是最有效的,但它的工作原理!祝你好运!!!

def createDict(fileName): 
    ''' 
     Returns a dict of fileName 
     ''' 
    data = {} #init dict 
    file = open(fileName, 'rb').readlines() #open File and create list of each line 
    for i in file: #loop through each file 
     i = i.replace('\r', '').replace('\n', '').split(':') #replace all instances of \n and \r and split at : 
     data[i[0]] = i[1] #add values to dict 
    return data #return dict 
1

创建它这里是另一种解决方案(它看起来更清晰的给我):

>>> with open("sample", 'r') as fd: 
... for line in fd.readlines(): 
... row = line.rstrip().split(":") 
... d[row[0]] = row[1] 
... 
>>> d 
{'name3': 'value3', 'me1': 'value1', 'name2': 'value2'} 
2

不需要调用“readlines方法”,文件对象支持iter协议。调用“readlines方法”将整个文件拉入内存

>>> d = {} 
>>> with open('var.txt') as myfile: 
...  for line in myfile: 
...   name, val = line.split(':') 
...   d[name] = val 
... 
>>> d 
{'name2': 'value2\n', 'name1': 'value1\n'} 

可以删除的行返回的字典中的值做:

d[name] = val.strip() 
+0

谢谢我不知道val.strip !这是否也会删除新行? – TheLazyScripter

+1

Derp,是的,我的意思是换行符,而不是行返回。默认情况下,我会刻上'\ n',或者你可以传入你想要从字符串的正面和背面剥离的任何东西。 – willnx

+0

大声笑,所以默认情况下,它只会从行中删除\ n?有没有内置的方法可以删除\ r? – TheLazyScripter

1

花式一个衬垫假设该文件总是存在性和可读性。

>>> dict(line.rstrip().split(':') for line in open('file.txt')) 

{'name2': 'value2', 'name3': 'value3', 'name1': 'value1'} 
+0

无需创建中间列表。 – tdelaney

+0

谢谢@tdelaney – helloV