2013-04-26 6 views
0

У меня есть код, который читается в CSV-файле. Затем код добавляет значения в зависимости от пользовательского ввода. Проблема, с которой я столкнулась, заключается в удалении записей, содержащих недопустимое значение. Особым недопустимым значением будет M. Я использую M для отсутствия в моем файле csv. Поэтому, по сути, я хочу, чтобы пользователь вводил начальные и конечные месяцы, затем код добавлял значения осадков. Однако, если строка должна содержать M, я не хочу включать эту строку данных. Например, частичная выборка приведена ниже.удалить строку на основе значения в python

Station,  Stat,  lat,  lon,  JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG 
Bainville 6 NE, 24-0408-06, 48.14065, -104.267, 0.10, 0.01, 0.12, 1.23, 0.02, 0.34, M, 0.00 
Brockton 20S, 24-1164-06, 47.5075, -104.324, M, 0.08, 0.13, 1.54, 2.43, 1.23, 1.12, 0.9 
Cohagen,  24-1875-06, 47.564, -106.7, 0.3, 0.37, M, 0.76, 1.55, 1.69, 0.35, 0.41 
Sidney,   24-7560-06, 47.36, -104.47, 0.1, 0.21, 0.05, 1.21, M, 1.25, 2.75, 0.89 

Теперь если пользователь выбрать месяцы JAN через Мары то, что я хотел бы, чтобы произошло это, что Brockten ряд (январь) и Cohagen ряд (MAR) быть опущен, как значение M. Однако если пользователь, выбранный через несколько месяцев, может затем пропустить строку, которая будет сидней.

Я надеюсь, что это имеет смысл. Я знаю, что этот пост очень длинный, но я также включу свой код.

################################################## 
import csv 
import array 
import decimal 
decimal.getcontext().prec = 4 
from time import gmtime, strftime 
print strftime("%Y-%m-%d %H:%M:%S", gmtime()) 

# Create an unordered MON to column number dictionary and get user data 
mdict = {'MAR': 11, 'FEB': 10, 'AUG': 16, 'SEP': 17, 'APR': 12, 'JUN': 14, 
     'JUL': 15, 'JAN': 9, 'MAY': 13, 'NOV': 19, 'DEC': 20, 'OCT': 18} 

month_start = raw_input('Input the 3 letter ID of beginning month: ') 
month_end = raw_input('Input the 3 letter ID of ending month: ') 
month_start = month_start.upper() 
month_end = month_end.upper() 
mon_layer_name = month_start + ' through ' +month_end 
user_month = '[' + mon_layer_name + ']' 
start_num = mdict[month_start] 
end_num = mdict[month_end]+1 
new_list = [['Station', 'Lat', 'Long', 'mysum']] 

with open('R:\\COOP\\temp\\COOP_rainfall2.csv', 'rb') as csvfile: 
    filereader = csv.reader(csvfile) 
    filereader.next() # this is to skip header 
    for row in filereader: 
     #print row 
     sta = row[0] 
     lat = row[2] 
     lon = row[3] 
     tot = decimal.Decimal(0) 
     for x in row[start_num:end_num]: 
      print 'now in line 34 in code' 
      if x == '': x = 0 
      elif x == 'M': # I think this is where I need to do something just not sure how ot accomplish it. 
       x = 0 
       print row 
      tot = tot + decimal.Decimal(x) 
     if tot == 0: continue 
     else: new_list.append([sta, lat, lon, str(tot)]) 

with open('R:\\COOP\\temp\\output.csv', 'wb') as csvout:   
    print 'Now in file writer code block' 
    filewriter = csv.writer(csvout) 
    for line in new_list: 
      filewriter.writerow(line) 

Rex = 'R:\\COOP\\temp\\output.csv' 
Precip=[] #creating an array named Precip 
inp = open (Rex,"r") 
for line in inp.readlines(): 
line.split(',') 
Precip.append(line) 
file.close(inp) 
print 'End of code' 

Любая помощь очень ценится.

ответ

0

Есть некоторые проблемы, которые необходимо решить до того, как ваш код будет работать. Я не уверен, что вы пытаетесь выполнить, но вот некоторые предложения:

Значения mdict неверны для данных образца, которые вы предоставили - JAN находится в позиции 3 для вашей строки заголовка.

В идеале, вы должны процедуризовать поиск, анализируя первую строку CSV, а не отбрасывая ее. Вы можете попробовать это ...

header_row = filereader.next() # if the months might NOT be uppercase, fix that here... 
start_num = header_row.index(month_start.upper()) 
end_num = header_row.index(month_start.upper()) 

После зафиксировано, что вы можете проверить на «M» в списке и использовать сумму() с пониманием, чтобы сделать добавление. Так как я не знаю, как вы хотите, чтобы справиться с «хорошими» строками я дам понять, где вы можете искать ответ ...

# first, see if 'M' is any of the values in the range you are looking for 
if 'M' in row[start_num:end_num]: 
    # skip this row 
    pass 
# if 'M' is not one of the values, do the math with a built in function instead of 
# writing the loop yourself (this uses a comprehension too... that is a replacement for your loop. 
else: 
    total = sum((decimal.Decimal(x) for x in row[start_num:end_num])) 

Уточнить ваши потребности немного, и я могу быть в состоянии чтобы помочь вам больше ...

Том

0

Вы можете подтвердить, что некоторые ячейки содержит поплавок (действительный), а не символ с кодом, как показано ниже:

def is_number(s): 
try: 
    float(s) # for int, long and float 
    return true 
except ValueError: 
    return False 

После того, как ряд «проблемы» идентифицировано, вы можете удалите эту строку с помощью сплайсинга с кодом, аналогичным приведенному ниже:

>>> print(a) 
[[0, 0, 0], [1, 1, 1], [2, 2, 2], [3, 'M', 3], [4, 4, 4], [5, 5, 5]] 
>>> problemRow =3 # would really use is_number here to identify row 3 
>>> a[0:problemRow] 
[[0, 0, 0], [1, 1, 1], [2, 2, 2]] 
>>> a[problemRow+1:] # nothing after the colon - extend to end 
[[4, 4, 4], [5, 5, 5]] 
>>> b = a[0:problemRow] 
>>> b.append(a[problemRow+1:]) 
>>> print(b) 
[[0, 0, 0], [1, 1, 1], [2, 2, 2], [[4, 4, 4], [5, 5, 5]]] 
Смежные вопросы