Форум сайта python.su
Tenebras,задача у тебя хорошая, но как ты решаешь - память жрет как не в себя
инфо к размышлению:
#!/usr/bin/env python # coding: utf8 import requests from metar import Metar def load_stations_to_file(url,fname): r = requests.get(url) if r.status_code != 200: print 'Error:',r.status_code return False else: f = open(fname, 'w+') f.write(r.text) f.close() return True class station(): def __init__(self,station_str): s = station_str.rstrip() if len(s) != 83: self.name = None self.ikao = None self.iata = None self.synop = None self.lat = None self.long = None self.country = None else: self.name = s[3:19] self.ikao = s[20:24] self.iata = s[26:29] self.synop = s[32:37] l = s[39:45] if l[-1:]=="W": self.lat = -float(l[0:2] +'.'+ l[3:5]) else: self.lat = float(str(l[0:2] +'.'+ l[3:5])) l = s[47:54] if l[-1:]=="S": self.long = -float(l[0:3]+'.'+l[4:6]) else: self.long = float(str(l[0:3]+'.'+l[4:6])) self.country = s[-2:] # def get(self): # return self.name,self.ikao,self.lat,self.long,self.country def get_metar(ikao): url='http://aviationweather.gov/metar/data?ids='+ikao+'&format=raw&hours=1&taf=on&layout=off&date=0' r = requests.get(url) if r.status_code != 200: return 'Error:' + r.status_code lst = r.text.split('\n') index = lst.index("<!-- Data starts here -->") line = lst[index + 1] if "No METAR found" in line: return line.split('<',)[1][2:] else: ods = line.split('<b',1)[0] return Metar.Metar(ods).string() if __name__=="__main__": url="http://weather.rap.ucar.edu/surface/stations.txt" fname="stations.txt" #каждый раз загружать не обязательно #load_stations_to_file(url,fname) f = open(fname) while True: l = f.readline() if not l: break st = station(l) if st.country == 'KZ': print '*' print st.name print get_metar(st.ikao) f.close()
Отредактировано vic57 (Окт. 16, 2016 16:51:11)
Офлайн
Tenebrasу мня все встало так:
И ещё. Пока было
from metar import Metar
не работало совсем, пришлось сделать
from metar import metar
pip install metar
Офлайн
0
vic57
у мня все встало так:
pip install metar
File "qwer.py", line 3, in <module>
import requests
ImportError: No module named requests
pip install requests
15:00 07.0 1038.0
Отредактировано Tenebras (Окт. 16, 2016 19:49:43)
Офлайн
0
Ещё вопрос. При переводе на python3 (правки вносил посредством 2to3) спотыкается на этом
# Ищем строку, предшествующую строке с данными METAR-телеграммы if line == "<!-- Data starts here -->": state = True continue
File "newmetar1.py", line 96 state == True ^ TabError: inconsistent use of tabs and spaces in indentation
Отредактировано Tenebras (Окт. 16, 2016 19:52:12)
Офлайн
76
отступы смотрите TabError
Офлайн
0
Спасибо! С этим ясно. Дальше ругается на
lines = list.split('\n')
File "newmetar1.py", line 23, in <module> lines = list.split('\n') TypeError: a bytes-like object is required, not 'str'
Офлайн
76
а если так
lines = str(list).split('\n')
Офлайн
0
Romissevd
а если так
["<class 'list'>"] ["<class 'list'>"] ["<class 'list'>"] ["<class 'list'>"] ["<class 'list'>"] ["<class 'list'>"] ["<class 'list'>"] ["<class 'list'>"] ["<class 'list'>"]
#!/usr/bin/python3 # coding: utf8 from numpy import * import csv import sys import urllib.request, urllib.parse, urllib.error # Подключаем библиотеки для работы с Интернет, import sys # для доступа к параметрам командной строки, import string # для работы со строками from datetime import datetime # Подключаем модуль для работы с датой и временем # Получаем текущую дату со временем t = datetime.strftime(datetime.utcnow(), "%Y-%m-%d_%H.%M") 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-станции station = row[0] # Создаем сокет-соединение с сервером sock = urllib.request.urlopen("http://aviationweather.gov/metar/data?ids="+station+"&format=raw&hours=0&taf=off&layout=on&date=0") # Записываем текст HTML-файла в переменную "metar" metar = sock.read() # Закрываем сокет-соединение с сервером sock.close() # Выводим текст HTML-файла на консоль #print metar # Разбиваем текст на отдельные строки lines = str(list).split('\n') print(lines) # Задаем начальное значение переменной с признаком наличия строки данных state = False # Перебираем все строки for line in lines: if line == "No METAR": break # Ищем строку, предшествующую строке с данными METAR-телеграммы if line == "<!-- Data starts here -->": state = True continue # Декодируем телеграммуj 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 # Получаем значение об облаках for i in par: summa = ' ' + row[0] + ' ' + row[1] + ' ' + row[2] + ' ' + row[3] + ' ' if "SKC" in par: print(st + summa + ' 0.00' + '\n', end=' ') break if "NSC" in par: print(st + summa + ' 0.00' + '\n', end=' ') break if "FEW" in par: print(st + summa + ' 0.00' + '\n', end=' ') break if 'SCT' in par: print(st + summa + ' 0.00' + '\n', end=' ') break if 'BKN' in par: print(st + summa + ' 0.00' + '\n', end=' ') break if 'OVC' in par: print(st + summa + ' 0.00' + '\n', end=' ') 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
Офлайн
76
Tenebras1. Текст записан в metar, а разбиваем list(вообще это зарезервированное для определения используйте другое имя переменной)# Записываем текст HTML-файла в переменную "metar" metar = sock.read() # Закрываем сокет-соединение с сервером sock.close() # Выводим текст HTML-файла на консоль #print metar # Разбиваем текст на отдельные строки lines = str(list).split('\n') print(lines)
lines = metar.decode('utf-8').split('\n')
Офлайн