我收到了另一个软件的“报告”,其中包含了我需要使用的数据。文件很简单。它有一个以变量名/描述开头的描述行。下一行是逗号分隔的数据。

    #wavelength,'<a comment describing the data>'
    400.0,410.0,420.0, <and so on>
    #reflectance,'<a comment describing the data>'
    0.001,0.002,0.002, <and so on>
    #date,'time file was written'
    2012-03-06 13:12:36.694597  < this is the bit that stuffs me up!! >

当我第一次键入一些代码时,我希望所有的数据都能作为浮动读取。但我发现了一些日期和字符串。就我的目的而言,我只关心应该是浮点数组的数据。我读到的其他所有内容(比如日期)都可以作为字符串处理(即使它们在技术上是一个日期)。
我的第一次尝试——直到我发现了非浮点数——基本上忽略了#然后抓起字符,继续制作一本字典,其中的键就是它刚刚读到的字符。然后,我通过在逗号上拆分并在行上堆叠二维数据,将键的条目设置为数组。类似于代码的下一节。
    data = f.readlines()
    dataLines = data.split('\n')

    for i in range(0,len(dataLines)-1):
        if dataLines[i][0] == '#':
            key,comment = dataLines[i].split(',')
            keyList.append(key[1:])
            k+=1
        else: # it must be data
            d+=1
            dataList.append(dataLines[i])

        for j in range(0,len(dataList)):
            tmp = dataList[j]

            x = map(float,tmp.split(','))
            tempData = vstack((tempData,asarray(x)))

    self.__report[keyList[k]] = tempData

当我在文件中找到一个非浮点值时,行“x=map(float,tmp.split(',')”失败(数据行中没有逗号)。我想我会尝试测试它是否是一个字符串或者不使用isinstance,但是文件读取器将来自文件的所有数据视为一个字符串(当然)。我试着把文件中的行转换成一个浮点数组,想如果它失败了,就把它当作一个字符串数组来处理——就像这样。
     try:
         scipy.array(tmp,dtype=float64)  #try to convert
         x = map(float,tmp.split(','))

     except:# ValueError: # must be a string
         x = zeros((1,1))
         x = asarray([tmp])
         #tempData = vstack((tempData,asarray(x)),dtype=str)
         if 'tempData' in locals():
             pass
         else:
             tempData = zeros((len(x)))

         tempData = vstack((tempData,asarray(x)))

但是,这会导致所有内容都作为字符数组读取,因此,我无法将数据作为numpy数组索引。例如,所有数据都在字典中,但数据类型是s | 8。似乎试块正走向例外。
如果你能给我一些建议,我将不胜感激,这样我就可以区分浮点数和字符串了。在我拿到报告之前我不知道数据的顺序。
此外,大文件可能需要很长时间才能加载到内存中,关于如何提高效率的任何建议也将不胜感激。
谢谢

最佳答案

我假设您最终对x感兴趣,它的格式应该是[400.0, 410.0, 420.0]
处理这个问题的一种方法是通过命令分离spliting by,并在两个不同的语句中转换为float操作,这样当您获得字符串元素而不是ValueErrorfloat时,就可以捕获int

keyList = []
dataList = []
with open('sample_data','r') as f:
    for line in f.readline():
        if line.startswith("#"):
            key, comment = line.split(',')
            keyList.append(key[1:])
        else: # it must be data
            dataList.append(line)

for data in dataList:
    data_list = data.split(',')
    try:
        x = map(float, data_list)
    except ValueError:
        pass

另外,请注意我对您的代码所做的其他细微更改,这使得代码在本质上更像是python。

关于python - 在文本文件Python中读取混合数据类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9580791/

10-12 16:58
查看更多