Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 28, 2017 23:53:49

Romissevd
От: Счастье
Зарегистрирован: 2015-03-01
Сообщения: 533
Репутация: +  76  -
Профиль   Отправить e-mail  

Не работает парсер

можно так

 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))

Офлайн

#2 Март 1, 2017 00:17:09

Tenebras
Зарегистрирован: 2016-07-05
Сообщения: 97
Репутация: +  0  -
Профиль   Отправить e-mail  

Не работает парсер

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

А в идеале должно оставаться одно значение - максимальное.
Но с этим разобраться не сложно.

Офлайн

#3 Март 1, 2017 01:21:39

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

Не работает парсер

 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

Отредактировано vic57 (Март 1, 2017 02:07:08)

Офлайн

#4 Март 1, 2017 03:20:58

Tenebras
Зарегистрирован: 2016-07-05
Сообщения: 97
Репутация: +  0  -
Профиль   Отправить e-mail  

Не работает парсер

Зря надеялся, что вопрос последний.
Не буду заваливать своими кодами. Сам разберусь, но хочется понять принцип.
Допустим имею два файла 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) - игнор.

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

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


Отредактировано Tenebras (Март 1, 2017 03:21:35)

Офлайн

#5 Март 1, 2017 04:28:16

wi34rd
Зарегистрирован: 2016-10-08
Сообщения: 89
Репутация: +  2  -
Профиль   Отправить e-mail  

Не работает парсер

Tenebras, читаете оба файла в словари, чтобы получилось что-то вроде этого:

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

Офлайн

#6 Март 1, 2017 05:46:33

scidam
Зарегистрирован: 2016-06-15
Сообщения: 288
Репутация: +  35  -
Профиль   Отправить e-mail  

Не работает парсер

Если файлы не слишком большие, то можно попробовать, например, так:

 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

Офлайн

#7 Март 1, 2017 08:08:45

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

Не работает парсер

 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]

Отредактировано vic57 (Март 1, 2017 09:15:33)

Офлайн

#8 Март 2, 2017 01:53:38

Tenebras
Зарегистрирован: 2016-07-05
Сообщения: 97
Репутация: +  0  -
Профиль   Отправить e-mail  

Не работает парсер

Пришёл к выводу, что проще и понятнее для меня будет сделать иначе. Но и тут вопрос.
Для начала код (упростил и укоротил его для примера только)

 #!/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-файла, то сколько тысяч циклов необходимо что бы его найти… С другой стороны поиск будет совершаться примерно так же? Верно?

Офлайн

#9 Март 2, 2017 07:00:23

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

Не работает парсер

это принципиально - каждый раз всё обрабатывать?
можно скачать в базу данных и делать 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 сек - обработка данных

Отредактировано vic57 (Март 2, 2017 07:48:14)

Офлайн

#10 Март 2, 2017 07:57:31

Tenebras
Зарегистрирован: 2016-07-05
Сообщения: 97
Репутация: +  0  -
Профиль   Отправить e-mail  

Не работает парсер

На разных станциях в разное время может быть или не быть информации. Поэтому список меняется.
Показатели облаков - меняются постоянно…

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

Что значит КАК?

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version