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

 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: Простите бедного студента
Romissevd
Tenebras
А что делать, если не находит ни чего из перечисленного?
Просто добавить print “Нет данных”, т.к. в Вашем случае если данные есть вы прерываете итерацию, если нет, то дойдете до последней строки.
 if 'NCD' in x:
                    print 'NCD'
                    break
print 'Нет данных'
vic57
в данном случае лучше if-elif-else и цикл не нужен
 s ='aa bb cc'
if 'aa' in s: print 'aa'
elif 'bb' in s: print 'bb'
else: print 'no data'
Tenebras
НЕ ПАШЕТ КАК НАДО! Всё перепробовал! Может кто подскажет так (выкладываю всю программу)

 #!/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

А должно быть время и значение!
А там где нет данных время почему-то идёт друг за другом без переноса…
Да и вообще оно не надо…
Romissevd
Попробуй так
 #!/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
Tenebras
А у меня выдаёт
 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
Romissevd
У меня третий питон, сейчас подумаем что сделать
Romissevd
 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,
Tenebras
Romissevd
Попробуй убрать запятую в конце st = strtime+':'+i,

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

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

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