Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 15, 2016 22:06:34

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

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

Не смог обозначить тему иначе. Ваяю программу и появляются вопросы по мелочи. То что не осилил умом и гуглом - хочу поспрашивать тут.
(НОВЫЙ ВОПРОС НИЖЕ В СООБЩЕНИИ!!!
Первый вопрос:
Обрабатываю некий файл, точнее одну строку из него;

 for x in par:    
                if "SKC" in x:
                    print '0.00',
                    break
                if "NSC" in x:
                    print '0.00',
                    break
                if "FEW" in x:
                    print '0.15',
                    break
                if 'SCT' in x:
                    print '0.40',
                    break
                if 'BKN' in x:
                    print '0.75'
                    break
                if 'OVC' in x:
                    print '1.00'
                    break
                if 'CAVOK' in x:
                    print 'CAVOK'
                    break
                if 'NCD' in x:
                    print 'NCD'
                    break

Тут всё прекрасно. Если имеем одно из каждого значения - на консоль выводится циферка. А что делать, если не находит ни чего из перечисленного?

Дело в том, что перед этим кодом у меня стоит

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

И выходит бяка: когда не находится ни одного из перечисленных значений, время-то всё равно показывается. Надо бы как-то добавить что-то типа “Нет данных!” или просто пропустить.
Лучше, если объясните - как сделать и тот и другой вариант.

PS: Простите бедного студента

Отредактировано Tenebras (Окт. 15, 2016 23:49:44)

Офлайн

#2 Окт. 15, 2016 22:33:35

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

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

Tenebras
А что делать, если не находит ни чего из перечисленного?
Просто добавить print “Нет данных”, т.к. в Вашем случае если данные есть вы прерываете итерацию, если нет, то дойдете до последней строки.
 if 'NCD' in x:
                    print 'NCD'
                    break
print 'Нет данных'

Офлайн

#3 Окт. 15, 2016 22:53:57

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

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

в данном случае лучше if-elif-else и цикл не нужен

 s ='aa bb cc'
if 'aa' in s: print 'aa'
elif 'bb' in s: print 'bb'
else: print 'no data'

Офлайн

#4 Окт. 15, 2016 23:49:09

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

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

НЕ ПАШЕТ КАК НАДО! Всё перепробовал! Может кто подскажет так (выкладываю всю программу)

 #!/usr/bin/python
# coding: utf8
from numpy import *
import csv
import sys
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) :  
#           if (0 < lon < 5 and 55 < lat < 60) :
                file.writelines("%s\t%.2f\t%.2f\t%.0f" % (icao, lat, lon, elev) + '\n')
            
file.close()
                
lines
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.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 = metar.split('\n')
    # Задаем начальное значение переменной с признаком наличия строки данных
    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:
                if i[-1] == 'Z':
                    timeUTC = int(i[2:4])
                    strtime = str(timeUTC)
                    print strtime+':'+i[4:6],
                    break
                
           
                
                       
            # Получаем значение об облаках
            for i in par:
                if "SKC" in par:
                    print '0.00' + '\n',
                    break
                if "NSC" in par:
                    print '0.00' + '\n',
                    break
                if "FEW" in par:
                    print '0.15' + '\n',
                    break
                if 'SCT' in par:
                    print '0.40' + '\n',
                    break
                if 'BKN' in par:
                    print '0.75' + '\n',
                    break
                if 'OVC' in par:
                    print '1.00' + '\n',
                    break
                if 'CAVOK' in par:
                    print 'CAVOK' + '\n',
                    break
                if 'NCD' in par:
                    print 'NCD' + '\n',
                    break   
                
                    
            # Сбрасываем признак строки с данными
        state = False

Выдаёт

 20:20 CAVOK
20:25 20:25 NCD
20:20 CAVOK
20:20 CAVOK
20:25 20:25 NCD
20:25 20:25 20:25 NCD
20:20 CAVOK
20:20 16:50 16:50 20:20 20:20 20:20 20:20 20:20 0.00
20:20 20:20 CAVOK
20:20 CAVOK
20:20 CAVOK
20:20 0.00
20:20 20:20 CAVOK
20:20 CAVOK

А должно быть время и значение!
А там где нет данных время почему-то идёт друг за другом без переноса…
Да и вообще оно не надо…

Офлайн

#5 Окт. 16, 2016 00:35:07

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

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

Попробуй так

 #!/usr/bin/python
# coding: utf8
from numpy import *
import csv
import sys
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) :  
#           if (0 < lon < 5 and 55 < lat < 60) :
                file.writelines("%s\t%.2f\t%.2f\t%.0f" % (icao, lat, lon, elev) + '\n')
            
file.close()
                
lines
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.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 = metar.split('\n')
    # Задаем начальное значение переменной с признаком наличия строки данных
    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:
                if i[-1] == 'Z':
                    timeUTC = int(i[2:4])
                    strtime = str(timeUTC)
                    st = strtime+':'+i[4:6],
                    break
                
           
                
                       
            # Получаем значение об облаках
            for i in par:
                if "SKC" in par:
                    print st + '0.00' + '\n',
                    break
                if "NSC" in par:
                    print st + '0.00' + '\n',
                    break
                if "FEW" in par:
                    print st + '0.15' + '\n',
                    break
                if 'SCT' in par:
                    print st + '0.40' + '\n',
                    break
                if 'BKN' in par:
                    print st + '0.75' + '\n',
                    break
                if 'OVC' in par:
                    print st + '1.00' + '\n',
                    break
                if 'CAVOK' in par:
                    print st + 'CAVOK' + '\n',
                    break
                if 'NCD' in par:
                    print st + 'NCD' + '\n',
                    break
                
                    
            # Сбрасываем признак строки с данными
        state = False

Результат у меня
 21:20CAVOK
21:25NCD
21:20CAVOK
21:20CAVOK
21:25NCD
21:20CAVOK
21:20CAVOK
21:20CAVOK
21:20CAVOK
21:20CAVOK
21:200.00

Отредактировано Romissevd (Окт. 16, 2016 00:46:12)

Офлайн

#6 Окт. 16, 2016 00:45:29

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

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

А у меня выдаёт

 Traceback (most recent call last):
  File "clouds_data_metar111.py", line 109, in <module>
    print st + 'CAVOK' + '\n',
TypeError: can only concatenate tuple (not "str") to tuple

Офлайн

#7 Окт. 16, 2016 00:47:06

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

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

У меня третий питон, сейчас подумаем что сделать

Офлайн

#8 Окт. 16, 2016 00:50:02

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

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

 for i in par:
                if i[-1] == 'Z':
                    timeUTC = int(i[2:4])
                    strtime = str(timeUTC)
                    st = strtime+':'+i[4:6]
                    break
Попробуй убрать запятую в конце st = strtime+':'+i,

Отредактировано Romissevd (Окт. 16, 2016 00:51:42)

Офлайн

#9 Окт. 16, 2016 00:54:56

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

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

Romissevd
Попробуй убрать запятую в конце st = strtime+':'+i,

Спасибо, помогло!

Буду дальше ковырять - там ещё надо кое что доделать.

Отредактировано Tenebras (Окт. 16, 2016 00:58:28)

Офлайн

#10 Окт. 16, 2016 00:59:00

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

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

Никуда. Просто мы формируем строку st из времени и значений облаков и только потом выводим ее, если же к времени мы не добавим значения облаков, то в итоге ничего не выводим. Как то так. Вообще много чего можно сократить в Вашем коде. Прислушайтесь к vic57 к примеру…

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version