读取输入文件和汇总数据

时间:2014-03-24 01:09:53

标签: python python-3.x

我正在为我的介绍级别计算类工作,我遇到了一个错误,我无法理解它为什么会发生。

我的目标(目前)是能够从输入文件中提取信息并以这样的方式存储它,即获得3个值 - 动物ID,访问时间和站点。

这是输入文件:

#Comments
a01:01-24-2011:s1
a03:01-24-2011:s2
a03:09-24-2011:s1
a03:10-23-2011:s1
a04:11-01-2011:s1
a04:11-02-2011:s2
a04:11-03-2011:s1
a04:01-01-2011:s1

a02:01-24-2011:s2
a03:02-02-2011:s2
a03:03-02-2011:s1
a02:04-19-2011:s2
a04:01-23-2011:s1
a04:02-17-2011:s1

#comments
a01:05-14-2011:s2
a02:06-11-2011:s2
a03:07-12-2011:s1
a01:08-19-2011:s1
a03:09-19-2011:s1
a03:10-19-2011:s2
a03:11-19-2011:s1
a03:12-19-2011:s2
a04:12-20-2011:s2
a04:12-21-2011:s2
a05:12-22-2011:s1
a04:12-23-2011:s2
a04:12-24-2011:s2

到目前为止,这是我的代码:

import os.path

def main():
    station1={}
    station2={}
    record=()
    items=[]
    animal=[]


endofprogram =False
try:
    filename1=input("Enter name of input file >")
    infile=open(filename1,"r")
    filename2=input('Enter name of output file > ')
    while(os.path.isfile(filename2)):
        filename2=input("File Exists!Enter name again>")
        outfile=open(filename2.strip(),"w")
except IOError:
    print("File does not exist")
    endofprogram=True

if endofprogram==False:
    print ('Continuing program')
    records=reading(infile)
    print('records are > ',records)




def reading(usrinput):
    for line in usrinput:
        if (len(line) !=0) or (line[0]!='#'):
                AnimalID,Timestamp,StationID =line.split()
                record= (AnimalID, Timestamp, StationID)
                data=data.append(record)
                return data

main()

我正在尝试打开文件并导入由':'分隔的3个数据集 我一直接受的错误就是这样:

Continuing programTraceback (most recent call last):
  File "C:\Program Files (x86)\Wing IDE 101 5.0\src\debug\tserver\_sandbox.py", line 39, in <module>
  File "C:\Program Files (x86)\Wing IDE 101 5.0\src\debug\tserver\_sandbox.py", line 25, in main
  File "C:\Program Files (x86)\Wing IDE 101 5.0\src\debug\tserver\_sandbox.py", line 34, in reading
builtins.ValueError: need more than 1 value to unpack

我试图将阅读功能中的术语切换为:

AnimalID,Timestamp,StationID =line.split(':') ]

但仍然没有。

2 个答案:

答案 0 :(得分:1)

问题是len(line) !=0始终为True。要选择不以#开头的非空行,您可以:

line = line.strip() # remove leading/trailing whitespace
if line and line[0] != '#': 
   fields = line.split(':') #NOTE: use ':' delimiter
   if len(fields) == 3:
      data.append(fields)

答案 1 :(得分:0)

我认为Comments是您文件中的一行。因此,reading函数尝试解析的第一行是Comments行。这不起作用,因为Comments在白色空间上分割线时不会创建三个元素长的序列:

AnimalID, Timestamp, StationID = line.split()  # won't work with headings

由于您最近对输入文件进行了格式设置,如果您过滤了尝试拆分的行,可以使用上述方法(也就是说,确保您要分割的行总是如此)有两个冒号,这将给你三个元素)。以下方法可能会说明您可能用来激发思考的另一种方法:

for line in lines:  # from the open file
    if ':' in line.strip():  # for example; need to distinguish from station visits from headings somehow
        print(line.split(':'))  # you don't really want to print here, but you should figure out how to store this data

正如我在评论中所说,你真的不想打印最后一行;你想将它存储在一些数据结构中。此外,您可能会找到一些更好的方法来区分具有站点访问的行和没有的行。我会留下这些物品让你弄明白,因为我不想为你毁掉剩下的任务。