Форум сайта python.su
Не смог обозначить тему иначе. Ваяю программу и появляются вопросы по мелочи. То что не осилил умом и гуглом - хочу поспрашивать тут.
(НОВЫЙ ВОПРОС НИЖЕ В СООБЩЕНИИ!!!
Первый вопрос:
Обрабатываю некий файл, точнее одну строку из него;
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
Отредактировано Tenebras (Окт. 15, 2016 23:49:44)
Офлайн
TenebrasПросто добавить print “Нет данных”, т.к. в Вашем случае если данные есть вы прерываете итерацию, если нет, то дойдете до последней строки.
А что делать, если не находит ни чего из перечисленного?
if 'NCD' in x: print 'NCD' break print 'Нет данных'
Офлайн
в данном случае лучше if-elif-else и цикл не нужен
s ='aa bb cc' if 'aa' in s: print 'aa' elif 'bb' in s: print 'bb' else: print 'no data'
Офлайн
НЕ ПАШЕТ КАК НАДО! Всё перепробовал! Может кто подскажет так (выкладываю всю программу)
#!/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
Офлайн
Попробуй так
#!/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)
Офлайн
А у меня выдаёт
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
Офлайн
У меня третий питон, сейчас подумаем что сделать
Офлайн
for i in par: if i[-1] == 'Z': timeUTC = int(i[2:4]) strtime = str(timeUTC) st = strtime+':'+i[4:6] break
Отредактировано Romissevd (Окт. 16, 2016 00:51:42)
Офлайн
Romissevd
Попробуй убрать запятую в конце st = strtime+':'+i,
Отредактировано Tenebras (Окт. 16, 2016 00:58:28)
Офлайн
Никуда. Просто мы формируем строку st из времени и значений облаков и только потом выводим ее, если же к времени мы не добавим значения облаков, то в итоге ничего не выводим. Как то так. Вообще много чего можно сократить в Вашем коде. Прислушайтесь к vic57 к примеру…
Офлайн