读取文本文件Python中的混合数据类型

时间:2012-03-06 09:17:45

标签: python file-io scipy

我从另一个包含我需要使用的数据的软件中获得了一些“报告”。该文件非常简单。它有一个以#开头的描述行,它是变量名称/描述。接着是下一行的逗号分隔数据。

例如

    #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!! >

当我第一次输入一些代码时,我希望所有数据都被读作浮点数。但我发现了一些日期和字符串。就我的目的而言,我所关心的是应该是浮点数组的数据。我读到的所有其他内容(例如日期)都可以视为字符串(例如,即使它们在技术上是日期)。

我的第一次尝试 - 直到我找到了非浮动 - 基本上忽略了#然后抓住了字符,继续制作一个字典,其中Key是它刚刚读取的字符。然后,我通过在逗号上分割并在行上堆叠二维数据来为密钥数组创建条目。类似于下一段代码。

    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数组。所有数据都在字典中,但dtype例如是s | 8。似乎try块直接异常。

我很感激任何关于让它工作的建议,所以我可以区分浮点数和字符串。在收到报告之前,我不知道数据的顺序。

此外,大文件可能需要很长时间才能加载到内存中,任何有关如何提高效率的建议也将受到赞赏。

由于

3 个答案:

答案 0 :(得分:3)

我假设您最终感兴趣的是x,其格式应为[400.0, 410.0, 420.0]

处理此问题的一种方法是将split by命令分开并转换为两个不同语句中的float操作,以便在获得字符串元素而不是ValueError或{{1}时捕获float }}

int

另请注意我对您的代码所做的其他细微更改,这使得它更具有pythonic性质。

答案 1 :(得分:0)

这可能是一个愚蠢的建议,但你可以做一个额外的检查

if ',' in dataLines[i]

在将行添加到数据列表之前?或者,如果没有,写一个正则表达式来检查逗号分隔的浮点数列表?

(\d(\.\d+)?)(,\d(\.\d+)?)*

可能会做到这一点(也允许整数)。

答案 2 :(得分:0)

编写一个 Python 程序来创建一个包含任何数据类型元素的文件(混合数据类型,即某些元素可能是 int 类型,某些元素可能是 float 类型,某些元素可能是 string 类型)。将此文件拆分为包含相同数据类型元素的三个文件(即仅整数的第一个文件,仅浮点数的第二个文件和仅字符串的第三个文件)。接受用户的输入以创建文件。

f = open('MixedFile.txt','w')
while True :
    user = input("Enter Any Data Type Element :: ")
    if user == 'end':
        print('!!!!!!!! EXIT !!!!!!!!!!!!')
        break
    else :
        f.write(user + '\n')
f.close()
f = open('MixedFile.txt')
a = []
a = f.read().split()
f.close()
fs = open ('StringFile.txt','w')
ff = open ('FloatFile.txt','w')
fn = open ('NumberFile.txt','w')
for i in a :
    try:
        int(i)
        fn.write(i + '\n')
    except:
            try:
                float(i)
                ff.write(i + '\n')
            except:
                fs.write(i + '\n')
f.close()
fs.close()
fn.close()
ff.close()

print("reading................")
fs = open ('StringFile.txt','r')
ff = open ('FloatFile.txt','r')
fn = open ('NumberFile.txt','r')
print(fs.read())
print(fn.read())
print(ff.read())