Форум сайта python.su
Странно… оО
Пробую совместить то, что было предложено с тем, что я натыкал до этого. Вот не пашет. Объясните - что не так?
#!/usr/bin/env python # coding:utf8 import requests from html2text import html2text url0 ='http://aviationweather.gov/metar/data?ids=' ikao = 'ULLI' page = requests.get(url0 + ikao).text lines = html2text(page).split('\n') state = False # Перебираем все строки for line in lines: if line == ikao: state = True print 'Hello!'
Отредактировано Tenebras (Окт. 17, 2016 07:07:35)
Офлайн
#if line == ikao:
if ikao in line :
Офлайн
#!/usr/bin/env python # coding:utf8 import requests from html2text import html2text url0 ='http://aviationweather.gov/metar/data?ids=' ikao = 'ULLI' page = requests.get(url0 + ikao).text lines = html2text(page) lines = lines.split('\n') state = False # Перебираем все строки for line in lines: if ikao in line: state = True print line break
Офлайн
#!/usr/bin/env python # coding:utf8 import requests from html2text import html2text def get_metar(url,ikao): page = requests.get(url + ikao).text lines = html2text(page).split('\n') # Перебираем все строки for line in lines: if ikao in line: return line return '' #возвращает строку данных, если ее нет - пустую строку if __name__=="__main__": url0 ='http://aviationweather.gov/metar/data?ids=' ikao = 'ULLI' metar_str = get_metar(url0,ikao) print metar_str
Отредактировано vic57 (Окт. 17, 2016 11:57:22)
Офлайн
vic57
применяй функции - меньше расход памяти и читать легче
в моей юности если функция больше 24 строк была - препод выгонял сразу, не читая
Офлайн
один из основных принципов кибернетики - черный ящик. я не знаю, что внутри, я знаю что на определенное воздействие будет определенный отклик. функция и есть такой ящик.
в данном случае - на входе - url и ikao, на выходе - строка metar-данных.
Офлайн
а по памяти:
1. запрос к сайту - возвращается page - висит в памяти
2. html2text - возвращает lines - висит в памяти
3. поиск и возврат metar-строки - возврат metar-строки, page и lines уничтожаются при возврате из фунции (все локальные переменные очищаются при выходе)
а 24 строки - в экран не влезало
Отредактировано vic57 (Окт. 19, 2016 03:09:08)
Офлайн
Сперва, думаю, надо написать так как осиливаю. После буду уже на фоне сделанного писать с использование функций. Буду пытаться…
Мне по-сути от программы нужно лишь два расшифрованных параметра. Точнее - один. Требуется вывод времени и вывод количества облаков. Причём в виде цифр. Всё это должно будет в будущем обрабатываться. Но это уже другая история.
Но я тут столкнулся с некой проблемой. В некоторых телеграммах встречается по несколько значений облаков. На разных высотах.
Пример тому:
PADK 190036Z AUTO 34008KT 9SM FEW027 BKN035 OVC050 06/M01 A2996 RMK AO1
BKN, FEW и OVC - всё это облака.
Мне, существенно, нужно что бы было указано самое большое значение.
if "SKC" in par: print ' 0.00' break elif "NSC" in par: print ' 0.00' break elif "FEW" in par: print ' 0.15' break elif 'SCT' in par: print ' 0.40' break elif 'BKN' in par: print ' 0.75' break elif 'OVC' in par: print ' 1.00' break
#!/usr/bin/env python # coding:utf8 import requests from html2text import html2text import csv import sys filename = "stations.txt" # Open data file fd = open(filename, "r") # Read data reader = csv.reader(fd, delimiter="\t") # Print data for row in reader: # Индекс ICAO-станции url0 ='http://aviationweather.gov/metar/data?ids=' page = requests.get(url0 + row[0]).text lines = html2text(page) lines = lines.split('\n') summa = ' ' + row[0] + ' ' + row[1] + ' ' + row[2] + ' ' + row[3] + ' ' # Перебираем все строки state = False for line in lines: if row[0] in line: state = True if state==True: par = line.split() for i in par: i = par[1] if i[-1] == 'Z': timeUTC = int(i[2:4]) strtime = str(timeUTC) st = strtime+':'+i[4:6] break cl = ['SKC', 'NSC', 'FEW', 'SCT', 'BKN', 'OVC',] dec = [0.00, 0.15, 0.40, 0,75, 1.00] if cl[0] or cl[1] in par: print st + dec[0] break elif cl[2] in par: print st + dec[1] break elif cl[3] in par: print st + dec[2] break elif cl[4] in par: print st + dec[3] break elif cl[5] in par: print st + dec[4] break # Сбрасываем признак строки с данными state = False
#!/usr/bin/python # coding: utf8 import urllib import sys import string # Получаем файл со списком станций c сервера weather.rap.ucar.edu sock = urllib.urlopen("http://weather.rap.ucar.edu/surface/stations.txt") list = sock.read() sock.close() # Разбиваем текст на отдельные строки lines = list.split('\n') file = open('stations.txt', 'w') # Перебираем по очереди все строки for line in lines: # Если длина строки 83 символа, то вырезаем из строки нужные значения if len(line) == 83 : # Индекс станции ICAO (отбрасываем пробелы слева и справа) icao = line[20:24].strip() # Если у данной станции есть индекс ICAO, то считываем остальные параметры if len(icao) == 4 : # Широта (градус) lat = float(line[39:41]) + float(line[42:44])/100 # Долгота (градус) lon = float(line[47:50]) + float(line[51:53])/100 # Высота над уровнем моря (м) elev = float(line[55:59]) # Если после широты стоит символ S, то делаем значение широты отрицательным if line[44:45] == 'S' : lat = -lat # Если после долготы стоит символ W, то делаем значение долготы отрицательным if line[53:54] == 'W' : lon = -lon # Записываем только станции, находящиеся от 0 до 60 в.д. и от 30 до 90 с.ш. # if (0 < lon < 60 and 30 < lat < 90) : file.writelines("%s\t%.2f\t%.2f\t%.0f" % (icao, lat, lon, elev) + '\n') file.close() lines
Отредактировано Tenebras (Окт. 19, 2016 04:16:28)
Офлайн
потому у тебя и не идет, что все в одну кучу свалено. станций в списке несколько тысяч, а ты все
подряд хочешь вывести. csv я бы сразу выкинул, файл текстовый и парсится легко
1.получи из файла список станций, которые тебе нужны
2.получи для станции данные metar
3.распарси данные metar.
это отдельные задачи, для каждой свою функцию делай.
Отредактировано vic57 (Окт. 19, 2016 04:40:25)
Офлайн
vic57Как не печально - нужны все станции. И то, даже это, не даст полной картины…
1.получи из файла список станций, которые тебе нужны
Офлайн