将文件行拆分为数组,然后解析为字典

时间:2014-05-14 15:21:59

标签: python parsing dictionary

我正在尝试读取文件。我想将文件的行解析为字典,但我似乎无法将该部分放入我的数组中。

我的文件如下:

记录:

2014-05-14,12:16:26,subject,{MSGTYPE="Personal" NAME="Fred" ADDRESS="Flat1" AGE=92 GENDER="M"}

2014-05-15,14:36:26,subject,{MSGTYPE="Personal" NAME="George" ADDRESS="Flat2"       AGE=-20 GENDER="M"}

2014-05-13,16:49:26,subject,{MSGTYPE="Personal" NAME="Ringo" ADDRESS="Flat3"    AGE=-36 GENDER="M"}

2014-05-12,14:45:26,subject,{MSGTYPE="Personal" NAME="Brian" ADDRESS="Flat4" AGE=-85 GENDER="M"}

2014-05-11,12:43:26,subject,{MSGTYPE="Personal" NAME="Paul" ADDRESS="Flat5" AGE=-33 GENDER="M"}

所以计划是将它拆分为','。然后取值4并将其放入自己的字典中。但是我在拆分方面做错了。

valuesArray = []
f = open(rvfile)
    for line in f:
        if not line.startswith('**Records**'):
            valuesArray = line.split(',')
            print '1: {0}'.format(valuesArray[0])
            print '2: {1}'.format(valuesArray[1])         

我收到错误:

Traceback (most recent call last):
    File "FAST_RV_Tests.py", line 70, in <module>
IndexError: index out of range: 1

第一张照片按照我的预期返回'1:2014-05-14'。但阵列中没有别的东西。

4 个答案:

答案 0 :(得分:1)

您的数据文件中可能有空行,并且拆分此行不会返回包含足够项目的列表。

在循环中,如果遇到空行,则应拨打continue

另一个提示是用第二个参数调用split告诉,应该应用多少个分裂。这将允许获取最终的JSON部分,您可以使用json.loads来获取内容

如果我修改您的数据以反映您最后有关于JSON数据的声明,

014-05-14,12:16:26,subject,{"MSGTYPE":"Personal", "NAME":"Fred", "ADDRESS":"Flat1", "AGE": 92, "GENDER":"M"}

2014-05-15,14:36:26,subject,{"MSGTYPE":"Personal", "NAME":"George", "ADDRESS":"Flat2", "AGE": -20, "GENDER":"M"}

2014-05-13,16:49:26,subject,{"MSGTYPE":"Personal", "NAME":"Ringo", "ADDRESS":"Flat3", "AGE": -36, "GENDER":"M"}

2014-05-12,14:45:26,subject,{"MSGTYPE":"Personal", "NAME":"Brian", "ADDRESS":"Flat4", "AGE": -85, "GENDER":"M"}

2014-05-11,12:43:26,subject,{"MSGTYPE":"Personal", "NAME":"Paul", "ADDRESS":"Flat5", "AGE": -33, "GENDER":"M"}

它会像这样工作:

import json
fname = "data.txt"
with open(fname) as f:
    for line in f:
        line = line.strip()
        if len(line) == 0:
            continue
        if line.startswith('**Records**'):
            continue
        valuesArray = line.split(',', 3)
        y, d = valuesArray[:2]
        print '1: {y}'.format(y=y)
        print '2: {d}'.format(d=d)    
        # bonus, read the json data
        print valuesArray[3]

        jsdata = json.loads(valuesArray[3])
        print "jsdata", jsdata

答案 1 :(得分:0)

print '2: {1}'.format(valuesArray[1])不应该是 print '2: {0}'.format(valuesArray[1])吗?

格式化中只有一个参数,索引1超出范围。

答案 2 :(得分:0)

您的错误出现在第二行format行:

print '2: {1}'.format(valuesArray[1])  

您只是格式化一个值,因此{1}应为{0}

{1}的正确使用方法是:如果你有这样的话:

print "1: {0} {1}".format(valuesArray[0], valuesArray[1])

答案 3 :(得分:0)

如果您的实际输入文件在您的示例所具有的记录之间有空行,那么这可能解释了为什么您的拆分不会产生任何值。另请注意,line将包含尾随的换行符,因此您可能需要在循环中调用line.strip()