Python逐行读取文件并转换为字典

时间:2020-06-23 13:44:59

标签: python

我在file.sec中有以下数据:

goog,100
goog,101
goog,103
micro,200
micro,201
face,99

我想将此数据转换为字典: {'goog':[100,101,103],'micro':[200,201],'face':[99]}

我尝试了下面的代码,但是只要值从goog变为micro,它就会清除列表,我得到的结果是:{'goog':[99],'micro':[99],'face':[99 ]}

allD = {}
allN = []
f = open('file.sec' , 'r')
for data in f:
   com = data.split(',')[0]
   
   if com not in allD.keys():
      del allN[:]

   allN.append( data.split(',')[1] )

   allD[ com ] = allN  
    
 print allD        

4 个答案:

答案 0 :(得分:4)

您可以使用defaultdict

from collections import defaultdict

result = defaultdict(list)

f = open('file.sec' , 'r')
for data in f:
    com = data.split(',')[0]
    result[com].append(data.split(',')[1]

答案 1 :(得分:4)

您可以使用defaultdict解决此问题:

from collections import defaultdict

data_dict = defaultdict(list)

f = open('file.sec' , 'r')
for data in f:
    key, value = data.split(',')
    data_dict[key].append(value)

请注意,我已经使用python 3语法编写了此代码,因此您可能需要对python 2稍作更改。

答案 2 :(得分:2)

您并不遥远,但是对于什么是Python分配却有误解。当您编写allD[ com ] = allN时,allD[com]不是allN的副本,而只是对同一对象的另一个引用。因此,当您以后用allN清理del allN[:]时,实际上是清理了最后一个allD[com]。您应该改用一个新对象:

allD = {}
allN = []
f = open('file.sec' , 'r')
for data in f:
   com = data.split(',')[0]
   
   if com not in allD.keys():
      allN = []
      allD[ com ] = allN  

   allN.append( data.split(',')[1] )

    
 print allD

答案 3 :(得分:0)

没有defaultdict的示例:

allD = {}
allN = []
f = open('data.csv', 'r')
for data in f:
    com = data.split(',')[0]

    if com not in allD.keys():
        allD[com] = []

    allD[com].append(data.split(',')[1].strip())

print(allD)