我从另一个包含我需要使用的数据的软件中获得了一些“报告”。该文件非常简单。它有一个以#开头的描述行,它是变量名称/描述。接着是下一行的逗号分隔数据。
例如
#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块直接异常。
我很感激任何关于让它工作的建议,所以我可以区分浮点数和字符串。在收到报告之前,我不知道数据的顺序。
此外,大文件可能需要很长时间才能加载到内存中,任何有关如何提高效率的建议也将受到赞赏。
由于
答案 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())