Найти - Пользователи
Полная версия: Несколько вопросов по программе
Начало » Центр помощи » Несколько вопросов по программе
1 2 3 4 5 6
vic57
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
Tenebras
И ещё. Пока было
from metar import Metar
не работало совсем, пришлось сделать
from metar import metar
у мня все встало так:
 pip install metar

Tenebras
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
Ещё вопрос. При переводе на 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

Что это такое и как поправить?
Romissevd
отступы смотрите TabError
Tenebras
Спасибо! С этим ясно. Дальше ругается на

 lines = list.split('\n')

Пишет

  File "newmetar1.py", line 23, in <module>
    lines = list.split('\n')
TypeError: a bytes-like object is required, not 'str'
vic57
неплохой ресурс по METAR
Romissevd
а если так
  lines = str(list).split('\n')
Tenebras
Romissevd
а если так

Какая-то фигня выходит(((
Я после вышеуказанной строчки подписал print(lines), дабы посмотреть - что не так.

Вот такое пошло на вывод

 ["<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
Romissevd
Tenebras
 # Записываем текст HTML-файла в переменную "metar"
    metar = sock.read()
    # Закрываем сокет-соединение с сервером
    sock.close()
    # Выводим текст HTML-файла на консоль
    #print metar
    # Разбиваем текст на отдельные строки
    lines = str(list).split('\n')
    print(lines)
1. Текст записан в metar, а разбиваем list(вообще это зарезервированное для определения используйте другое имя переменной)
2. Вот так попробуйте
 lines = metar.decode('utf-8').split('\n')
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