Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 16, 2016 01:02:31

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

Несколько вопросов по программе

Tenebras, тебе уже объясняли

 #!/usr/bin/env python
# coding: utf8
import urllib
from metar import Metar
def load_data(url):
    out = None
    data = urllib.urlopen(url)
    for line in data:
         if 'Data at:' in line:
             break
    line = data.readline()
    if '<!-- Data starts here -->' in line:
        line = data.readline()
        out = line.split('<b', 1)[0]
    data.close()
    return out
if __name__=="__main__":
    st = ['UKBB',
        'ULMM',
        'ULAA',
        'UHMA',
        'UIBB',
        'UUEE',
        'EGLL',
        'PABR',
        'BIRK',
        ]
    for i in st:
        url='http://aviationweather.gov/metar/data?ids='+i+'&format=raw&hours=1&taf=off&layout=off&date=0'
        s = load_data(url)
        ods = Metar.Metar(s)
        print '*'
        print ods.string()
    
 

Отредактировано vic57 (Окт. 16, 2016 01:06:19)

Офлайн

#2 Окт. 16, 2016 01:47:49

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

Несколько вопросов по программе

Спасибо. Но я не достоин пока принять на себя дары такие.

Ну правда - дали мне задание так вот сделать, я и делаю. А вот подобным способом я для себя попробую. За что и спасибо - старания отвечающего не пропадут зря!!!

Кстати, вопрос к МОЕМУ сирому и убогому коду:

 # Извлекаем дату и время
            for i in par:
                if i[-1] == 'Z':
                    timeUTC = int(i[2:4])
                    strtime = str(timeUTC)
                    st = strtime+':'+i[4:6]
                    break

Вот по поводу этого кусочка. Дело в том, что в телеграмме, которую я обрабатываю попадаются комбинации, типа CZ или FZ. Натыкаясь на это программа глючит, так как эти буковки ко времени не относятся. Как можно указать программе, что бы она игнорила подобные казусы?

Собственно мне нужна исключительно первая буква Z из телегшраммы - остальные не нужно. Время указанно так: 152230Z
Что в переводе на русский обозначает 22 часа 30 минут

Офлайн

#3 Окт. 16, 2016 02:23:17

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

Несколько вопросов по программе

 i = par[1]
if i[-1] == 'Z'
# и т.д.
время в метар-строке идет 2 элементом

Отредактировано vic57 (Окт. 16, 2016 02:23:49)

Офлайн

#4 Окт. 16, 2016 02:33:35

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

Несколько вопросов по программе

Благодарю!

Кстати - про метар библиотеки: тяжко мне их освоить.
Пока путных мануалов не нашёл…
Но согласен, что вещь вкусная.

Офлайн

#5 Окт. 16, 2016 02:56:03

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

Несколько вопросов по программе

 fd = open("stations.txt")
# Read data
reader = csv.reader(fd, delimiter='\t')
for row in reader:
# Индекс ICAO-станции
    station = row[0]
    # Создаем сокет-соединение с сервером
    sock = urllib.urlopen("http://aviationweather.gov/metar/data?ids="+station+"&format=raw&hours=0&taf=off&layout=off&date=0")
    # Записываем текст HTML-файла в переменную "metar"
    metar = sock.read()
    # Закрываем сокет-соединение с сервером
    sock.close()
    # Разбиваем текст на отдельные строки
    lines = metar.split('\n')
    # Ищем строку, предшествующую строке с данными METAR-телеграммы
    index = lines.index("<!-- Data starts here -->")
    par = lines[index+1]
    if not "No METAR found" in par:
        lst = par.split()
        # Извлекаем дату и время
        i = lst[1]
        if i[-1] == 'Z':
            timeUTC = int(i[2:4])
            strtime = str(timeUTC)
            print strtime+':'+i[4:6],                                       
        # Получаем значение об облаках
        if "SKC" in lst:
            print '0.00'
        elif "NSC" in lst:
            print '0.00'
        elif "FEW" in lst:
            print '0.15'
        elif 'SCT' in lst:
            print '0.40'
        elif 'BKN' in lst:
            print '0.75'
        elif 'OVC' in lst:
            print '1.00'
        elif 'CAVOK' in lst:
            print 'CAVOK'
        elif 'NCD' in lst:
            print 'NCD'
        else: print 'no data'
    else: print par.split('<')[1][2:]

Отредактировано vic57 (Окт. 16, 2016 03:20:28)

Офлайн

#6 Окт. 16, 2016 05:59:10

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

Несколько вопросов по программе

Благодарю! И самый последний вопрос по этой программе:

Как запись в файл наладить? Всего, что выводится на терминал.

Офлайн

#7 Окт. 16, 2016 08:32:10

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Несколько вопросов по программе

Tenebras
Как запись в файл наладить? Всего, что выводится на терминал.
А вот этого не надо делать. Вы уже вкусили парсинга данных, формат которых не был продуман при разработке. Потратили кучу времени. Для записи применяйте формат который будет легко потом использовать и вам и другим людям.


Самое простое использовать json. https://docs.python.org/3/library/json.html https://docs.python.org/2/library/json.html

Для этого надо не просто печатать данные, а накапливать их в списках, словарях и т.п. Хороший тон числа записывать в виде чисел а не строк.

p.s.
для совсем ленивых, или если у вас только 2 секунды времени на получение результата. Можно стразу перенаправить результат из командной строки python script >a.txt или
использовать tee если вам любопытно что получается
https://ru.wikipedia.org/wiki/Tee



Отредактировано doza_and (Окт. 16, 2016 08:34:55)

Офлайн

#8 Окт. 16, 2016 16:25:42

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

Несколько вопросов по программе

vic57
Tenebras, тебе уже объясняли

Постигаю ваш ответ. Но у меня спотыкается и выдаёт

 13:00 08.0 1038.0
Traceback (most recent call last):
  File "ger.py", line 31, in <module>
    ods = metar.metar(s)
AttributeError: 'str' object has no attribute 'metar'

И ещё. Пока было

 from metar import Metar

не работало совсем, пришлось сделать

 from metar import metar

хоть что-то выдало…

Отредактировано Tenebras (Окт. 16, 2016 16:26:11)

Офлайн

#9 Окт. 16, 2016 16:40:15

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

Несколько вопросов по программе

Стесняюсь спросить, а Вы установили библиотеку metar.
И второе, в Вашем коде, еще до того как вы начали использовать бибилиотеку metar, есть переменная с именем metar, которой вы присваиваете строку. Это может вызвать конфликт имен или их переопределения.

     # Записываем текст HTML-файла в переменную "metar"
    metar = sock.read()

Отредактировано Romissevd (Окт. 16, 2016 16:40:50)

Офлайн

#10 Окт. 16, 2016 16:49:23

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

Несколько вопросов по программе

Romissevd
Стесняюсь спросить, а Вы установили библиотеку metar.

Спрашивайте -не стесняйтесь!
Установил - не сомневайтесь!

Romissevd
в Вашем коде

Код не мой! Я просто разместил объяву!

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version