2016-12-20 15 views
0

У меня есть очень большой текстовый файл, который, скажем, измерения широты от 2 GPS-антенн. В файле много мусора, и мне нужно извлечь из него измерения широты. Они всегда встречаются иногда между другими строками другого текста. линия, в которой они происходят, как выглядит:Как извлечь два конкретных числа из нескольких строк текстового файла в python

12:34:56.789 78:90:12.123123123 BLAH_BLAH blahblah :  LAT #1 MEAS=-80[deg], LAT #2 MEAS=-110[deg] blah_BlHaBKBjFkjsa.c 

Числа, которые мне нужны те, между «LAT #1 MEAS=-80[deg]» и «LAT #2 MEAS=-110[deg]». Итак, в основном -80 и -110.

Остальной текст для меня не важен.

Вот образец текст из входного файла:

08:59:07.603 08:59:05.798816 PAL_PARR_INTF TraceModule GET [email protected] :82 drv_Shm.c (../../../PALCommon/Platform_EV/HAL/Common/driver/Shm/src) 525 
08:59:07.603 08:59:05.798816 PAL_PARR_INTF TraceModule xdma is not running drv_Shm.c (../../../PALCommon/Platform_EV/HAL/Common/driver/Shm/src) 316 
08:59:07.603 08:59:05.798847 PAL_PARR_INTF TraceModule DMA is activated drv_Shm.c (../../../PALCommon/Platform_EV/HAL/Common/driver/Shm/src) 461 
08:59:10.847 08:59:09.588001 UHAL_SRCH TraceFlow :  LAT #1 MEAS=-80[deg], LAT #2 MEAS=-110[deg] uhal_CHmcpPschMultiPath.c (../../../HEDGE/UL1/UHAL_3XX/Searcher/Code/Src) 1596  
08:59:11.440 08:59:10.876819 UHAL_COMMON TraceWarning cellRtgSlot=0 cellRtgChip=1500 CELLK_ACTIVE=1 boundary RSN 232482 current RSN 232482 boundarySFN 508 currentSFN 508 uhal_Hmcp.c (../../../HEDGE/UL1/UHAL_3XX/platform/Code/Src) 2224  
08:59:11.440 08:59:10.877277 UHAL_SRCH TraceWarning uhal_HmcpSearcherS1LISR: status_reg(0xf0100000) uhal_CHmcpPschMultiPath.c (../../../HEDGE/UL1/UHAL_3XX/Searcher/Code/Src) 1497  
08:59:11.440 08:59:10.877307 UHAL_COMMON TraceWarning uhal_HmcpSearcherSCDLISR is called. uhal_CHmcpPschMultiPath.c (../../../HEDGE/UL1/UHAL_3XX/Searcher/Code/Src) 1512  
08:59:11.440 08:59:10.877338 UHAL_SRCH TraceFlow :  LAT #1 MEAS=-78[deg], LAT #2 MEAS=-110[deg] uhal_CHmcpPschMultiPath.c (../../../HEDGE/UL1/UHAL_3XX/Searcher/Code/Src) 1596  

Теперь я использую код, чтобы открыть файл и получить эти значения, но она не работает. Я новичок в программировании, поэтому я понятия не имею, где я здесь ошибся.

import re                  

    # Importing 're' for using regular expressions 

file_dir=raw_input('Enter the complete Directory of the file (eg c:\\abc.txt):') # Providing the user with a choice to open their file in .txt format 
with open(file_dir, 'r') as f: 
    lat_lines= f.read()               # storing the data in a variable 

# Declaring the two lists to hold the numbers 
raw_lat1 = [] 
raw_lat2 = [] 

start_1 = 'LAT #1 MEAS=' 
end_1 = '[de' 

start_2 = 'LAT #2 MEAS=' 
end_2 = '[de' 

x = re.findall(r'start_1(.*?)end_1',lat_lines,re.DOTALL) 
raw_lat1.append(x) 

y = re.findall(r'start_2(.*?)end_2',lat_lines,re.DOTALL) 
raw_lat2.append(y) 

ответ

0

Это должно сделать это (он не использует регулярное выражение, но он все еще работает)

answer = [] 
with open('file.txt') as infile: 
    for line in infile: 
     if "LAT #1 MEAS=" not in line: continue 
     if "LAT #2 MEAS=" not in line: continue 
     splits = line.split('=') 
     temp = [0,0] 
     for i,part in enumerate(splits): 
      if part.endswith("LAT #1 MEAS"): temp[0] = int(splits[i+1].split(None,1)[0].split('[',1)[0]) 
      elif part.endswith("LAT #2 MEAS"): temp[1] = int(splits[i+1].split(None,1)[0].split('[',1)[0]) 
     answer.append(temp) 
+0

Спасибо за ответ. Я попробовал, но это просто дает мне пустой список. в выходном файле есть только [], [], [], [], [], [], [], [], если я печатаю список ответов. –

+0

@uddinM: отредактируйте свое исходное сообщение, чтобы включить образец входного файла, чтобы я мог правильно проверить – inspectorG4dget

+0

Добавлен образец вопроса. –

0

Есть пара проблем с регулярным выражением, что я могу увидеть здесь. В вашем вызове re.findall вы используете start_1 и, как если бы они были переменными, но регулярное выражение фактически просто обрабатывает их как необработанные символы "start_1" и "end_1" и т. Д. Чтобы использовать переменные в строке регулярного выражения, вместо этого нужно использовать форматированные строки. Пример:

r'%s(.*?)%s' % (start_1, end_1) 

Кроме того, при использовании .*end_1, это будет соответствовать любому символу, поэтому он не будет соответствовать всем символов до последнего совпадения end_1 на линии. Оба значения LAT #1 и LAT #2 заканчиваются таким же образом, поэтому, если бы все остальное было правильным в отношении строки, это фактически соответствовало бы «» -80 [deg], LAT # 2 MEAS = -110 [de »

Кроме того, когда вы используете скобки в регулярном выражении, вы должны избегать их. Буквенные скобки используются для указания набора символов в регулярных выражениях.

Вот пример, где я просто предполагаю, что переменная line содержит вашу примерную строку "12:34:56.789 78:90:12.123123123 BLAH_BLAH blahblah : LAT #1 MEAS=-80[deg], LAT #2 MEAS=-110[deg] blah_BlHaBKBjFkjsa.c". Возможно, вам придется настроить этот фрагмент для всего файла.

prefix = r'LAT %s MEAS=(-?\d+)\[deg\]' # includes format string for the variable part of the expression. 
p1 = r'#1' 
p2 = r'#2 
x = re.findall(prefix % p1, line) 
y = re.findall(prefix % p2, line)