仅从txt

时间:2018-06-28 02:28:52

标签: python numpy

我有一个txt文件,其中包含丢失的信息,我不希望它的头和尾,我只需要中间的数字即可。这是一个1x11200的矩阵。

[txtpda]
LT=5.6
DATE=21.06.2018
TIME=14:11
CNT=11200
RES=0.00854518
N=5
VB=350
VT=0.5
LS=0
MEASTIME=201806211412
PICKUP=BFW-2
LC=0.8
[PROFILE]
255
256
258
264
269
273
267
258
251
255
259
262
260
256
255
260
264
266
265
263
261
263
267
275
280
280
280
280
283
284
283
277
279
280
283
285
283
282
280
280
286
288
298
299
299
299
304
303
300
297
295
296
299
301
303
301
299
296
298
299
302
303
304
307
308
312
313
314
312
311
311
310
312
310
309
305
303
299
297
294
288
280
270
266
250
242
222
213
199
180
173
...
-1062
-1063
[VALUES]
Ra;2;3;2;0.769;0;0;-1;0;-1;0
Rz;2;2;2;5.137;0;0;-1;0;-1;0
Pt;0;0;0;26.25;0;0;-1;0;-1;0
Wt;0;0;0;24.3;0;0;-1;0;-1;0

现在我使用以下方法提取数字:

def OpenFile(): 
    name=askopenfilename(parent=root)
    f=open(name,'r')
    originalyvec1=[]
    yvec1=[]
    if f==0:
        print("fail to open the file")
    else:
        print("file successfully opened")
        data=f.readlines()
        for i in range(0,14):
            del data[0]//delete its head(string)
        del data[11204]//delete its tail(string)
        del data[11203]//delete its tail(string)
        del data[11202]//delete its tail(string)
        del data[11201]//delete its tail(string)
        del data[11200]//delete its tail(string)
        for line in data:
            for nbr in line.split():  //delete \n
                yvec1.append(int(nbr))
    if f.close()==0:
        print("fail to close file")
    else:
        print("file closed")

我想使用numpy轻松管理它。有可能吗?
例如np.array或类似的东西。

3 个答案:

答案 0 :(得分:2)

您可以使用iter()的另一种形式,在其中向iter()传递一个函数,它将继续调用该函数,直到看到该值为止(第二个arg)。您可以使用它跳过直到看到[PROFILE]\n,然后使用相同形式的iter()阅读直到[VALUES]\n。该函数只是next(iterable)所调用的函数,即iterable.__next__,例如:

with open(name) as f:
    for _ in iter(f.__next__, '[PROFILE]\n'):   # Skip until PROFILE
        pass  
    yvec1 = [int(d) for d in iter(f.__next__, '[VALUES]\n')]

yvec1现在将包含[PROFILE][VALUES]之间的所有值。

使用第一个iter()的另一种可能更快的方式是使用collections.deque()而不是for循环,但这对于这个问题可能是过分的,例如:

deque(iter(f.__next__, '[PROFILE]\n'), maxlen=0)

注意:使用with会自动在该块的末尾close(f)

答案 1 :(得分:1)

您只需将data=f.readlines()及以下行中的所有内容替换为:

data = [int(line) for line in map(str.strip, f.readlines()) if line.isdigit() or line.startswith('-') and line[1:].isdigit()]

data将是您要查找的整数列表。

答案 2 :(得分:0)

只为您提供想法可能会有所帮助
s3 [0]将是PROFILE和VALUES之间的所有数字

#s=your data
s='sjlkf slflsafj[PROFILEl9723,2974982,2987492,886[VALUES]skjlfsajlsjal'
s2=s.split('[PROFILE]')
s3=s2[1].split('[VALUES]')
相关问题