我收到了另一个软件的“报告”,其中包含了我需要使用的数据。文件很简单。它有一个以变量名/描述开头的描述行。下一行是逗号分隔的数据。
如
#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操作,这样当您获得字符串元素而不是ValueError
或float
时,就可以捕获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/