我从另一款软件获得了一些“报告”,其中包含我需要使用的数据。该文件非常简单。它有一个以# 开头的描述行,即变量名称/描述。下一行是逗号分隔的数据。
例如
#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!! >
当我第一次输入一些代码时,我希望所有数据都被读取为 float 。但我发现了一些日期和字符串。出于我的目的,我只关心应该是 float 组的数据。我读入的所有其他内容(例如日期)都可以视为字符串(例如,即使它们在技术上是日期)。
我的第一次尝试 - 在我发现非 float 之前一直有效 - 基本上忽略了 # 然后抓取字符继续它制作一个字典,其中的键是它刚刚读取的字符。然后,我通过在逗号上拆分并在二维数据的行上堆叠,使键的条目成为一个数组。类似于下一段代码。
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
当我在我的文件中发现非 float 时,“x = map(float,tmp.split(','))”行失败(数据行中没有逗号)。我想我会尝试使用 isinstance 来测试它是否是一个字符串,但是文件读取器会将来自文件的所有数据都视为一个字符串(当然)。我尝试尝试将文件中的行转换为 float 组,想着如果失败则将其视为字符串数组 - 就像这样。
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 block 直接进入异常。
我将不胜感激任何关于让它工作的建议,这样我就可以区分 float 和字符串。在得到报告之前,我不知道数据的顺序。
此外,大文件可能需要很长时间才能加载到内存中,如有任何关于如何提高效率的建议,我们将不胜感激。
谢谢
最佳答案
我假设您最终对 x
感兴趣其格式应为 [400.0, 410.0, 420.0]
.
处理此问题的一种方法是在两个不同的语句中将按命令拆分并转换为浮点操作,这样您就可以捕获 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/