Найти - Пользователи
Полная версия: Не работает парсер
Начало » Центр помощи » Не работает парсер
1 2 3 4
Romissevd
можно так
 from decimal import Decimal
q = Decimal('0.00')
a = 1.00
b = 0.75
c = 0.00
x = [a,b,c]
print (Decimal(min(x)).quantize(q))
Tenebras
vic57
#…
for bl in block:
ikao = bl.find('station_id').text
clouds = bl.findall('sky_condition')
out =
for i in clouds:
out.append(i.get('sky_cover'))
print ikao,' '.join(out)


Последний вопрос, который меня мучает.

Как можно в этом скрипте подменить буквенные значения на цифровые.

OVC = 1.00
BKN = 0.75
SCT = 0.40
FEW = 0.15
SKC = 0.00

Например

AYPY 21:00 SCT SCT


Должно выглядеть как:

AYPY 0.40 0.40

А в идеале должно оставаться одно значение - максимальное.
Но с этим разобраться не сложно.
vic57
 d = {'OVC':1.00,'BKN': 0.75,'SCT':0.40,'FEW':0.15,'SKC':0.00,'CLR':0}
for bl in block:
    ikao = bl.find('station_id').text
    clouds = bl.findall('sky_condition')
    out = []
    for i in clouds:
        key = i.get('sky_cover')
        out.append(d[key])
    if out: print ikao,out,max(out)
    else: print ikao
Tenebras
Зря надеялся, что вопрос последний.
Не буду заваливать своими кодами. Сам разберусь, но хочется понять принцип.
Допустим имею два файла 1.txt и 2.txt

1.txt
ODIN 11 12 13
DVA 21 22 23
TRI 31 32 33
NULL 01 02 03

2.txt
DVA 444 555
CHE 344 324
TRI 777 888
SEM 987 435
ODIN 999 000

Что нужно?
Берём из первого файла первое значение - ODIN и ищем его во втором файле. Находим и прибавляем все значения из его строки в первый файл. То есть, например, должно получится -
ODIN 11 12 13 999 000
Если не встречается во втором файле какое-то значение (в нашем случае - NULL) - игнор.

Я час отгуглил но ни чего конкретного не обнаружил.

Если реализация добавления сложна, то можно создать новый файл в который будет записано получившееся.


wi34rd
Tenebras, читаете оба файла в словари, чтобы получилось что-то вроде этого:
 #
odin_txt = {'ODIN': [11, 12, 13], ...}
dva_txt = {...}
Проходите по ключам первого словаря и смотрите их во фтором с использованием оператора in. Добавляете значения с помощью метода list.extend().
scidam
Если файлы не слишком большие, то можно попробовать, например, так:

 import pandas as pd
data1 = pd.read_table('one.txt', header=None, sep='\s+',
                      na_values='NA', keep_default_na=False)
data2 = pd.read_table('two.txt', header=None, sep='\s+',
                      na_values='NA', keep_default_na=False)
result = []
for ind, item in data1.iterrows():
    res = data2.ix[data2[0]==item[0], :]
    if not res.empty:
        ss = pd.concat([data1.iloc[ind, :], res.iloc[0,1:]])
    else:
        ss = data1.iloc[ind,:]
    result.append(ss.tolist())
print(result) # save results to a new file
vic57
 def fn(d,l,flag=True):
    for i in l:
        tmp = i.strip().split(' ')
        key = tmp[0]
        if not key in d:
            if not flag: continue
            else: d[key] = []
        for i in tmp[1:]: d[key].append(i)
    return d
    
f1 = open('1.txt').readlines()
f2 = open('2.txt').readlines()
d = fn({},f1,True)
d = fn(d,f2,False)
for i in d:print i,d[i]
Tenebras
Пришёл к выводу, что проще и понятнее для меня будет сделать иначе. Но и тут вопрос.
Для начала код (упростил и укоротил его для примера только)

 #!/usr/bin/env python
# coding:utf8
from lxml import etree
import urllib
url = 'https://aviationweather.gov/adds/dataserver_current/current/metars.cache.xml'
urllib.urlretrieve(url, filename='metar.xml')
tree = etree.parse('metar.xml') # Парсинг файла
block = tree.xpath('/response/data/METAR')
qwerty = ['ULLI', 'UBBL', 'LRCT']	
for a in qwerty:
    
    for b in block:
        ikao = b.find('station_id').text
        if ikao != a:
            continue
        clouds = b.findall('sky_condition')
        time = b.find('observation_time').text
        tim = time.split(r'T')
        ti = tim[1].split(r':')
        t = ti[0]+':'+ti[1]
        out = []
        for i in clouds:
            out.append(i.get('sky_cover'))
        print ikao,str(t) ,' '.join(out)
        break

Вопрос в том, что цикл повторяется до тех пор, пока не найдёт нужное значение. Когда он его находит, считывает данные и цикл прекращается. Потом ищется второе значение и т.д.
У меня таких значений - около 4000 и выполнение скрипта длится 6 минут.
Сильно ли ускорит работу программы простой поиск значения (допустим ULLI)?
Ведь если ULLI находится почти в конце XML-файла, то сколько тысяч циклов необходимо что бы его найти… С другой стороны поиск будет совершаться примерно так же? Верно?
vic57
это принципиально - каждый раз всё обрабатывать?
можно скачать в базу данных и делать update/select для тех станций, которые тебе нужны
и как ты алгоритмы придумываешь?
 #!/usr/bin/env python
# coding:utf8
from lxml import etree
import urllib
import time
tp1 = time.time()
url = 'https://aviationweather.gov/adds/dataserver_current/current/metars.cache.xml'
urllib.urlretrieve(url, filename='metar.xml')
tp2 = time.time()
tree = etree.parse('metar.xml') # Парсинг файла
block = tree.xpath('/response/data/METAR')
qwerty = ['ULLI', 'UBBL', 'LRCT']	
for b in block:    
        ikao = b.find('station_id').text
        if not ikao in qwerty: continue
        clouds = b.findall('sky_condition')
        time0 = b.find('observation_time').text
        tim = time0.split(r'T')
        ti = tim[1].split(r':')
        t = ti[0]+':'+ti[1]
        out = []
        for i in clouds:
            out.append(i.get('sky_cover'))
        print ikao,str(t) ,' '.join(out)
tp3 = time.time()
print 'execution time',tp2 - tp1,tp3 - tp2
 ULLI 05:00 OVC
UBBL 05:00 OVC
LRCT 05:00 BKN
execution time 19.0136210918 0.384562015533
19 сек - запрос к серверу, 0.4 сек - обработка данных
Tenebras
На разных станциях в разное время может быть или не быть информации. Поэтому список меняется.
Показатели облаков - меняются постоянно…

и как ты алгоритмы придумываешь?

Что значит КАК?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB