извлечь только целое число из текста - PullRequest
0 голосов
/ 28 июня 2018

У меня есть текстовый файл, который содержит потерянные данные, я не хочу его голову и хвост, мне нужны только цифры в середине. которая представляет собой матрицу 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 голосов
/ 28 июня 2018

Просто чтобы дать вам идею, это может помочь
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]')
0 голосов
/ 28 июня 2018

Вы можете использовать альтернативную форму iter(), где вы передаете iter() функцию, и она будет продолжать вызывать эту функцию, пока не увидит значение (2-й аргумент). Вы можете использовать это, чтобы пропустить, пока не увидите [PROFILE]\n, а затем использовать ту же самую форму iter() для чтения до [VALUES]\n. Эта функция вызывается только next(iterable), то есть iterable.__next__, например ::100100

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) в конце блока.

0 голосов
/ 28 июня 2018

Вы можете просто заменить все из строки 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 будет список целых чисел, которые вы ищете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...