2017-02-09 25 views
0

Я получил этот упорядоченный список выдыхаемого OSM Tilenames из CSV Файл:Python- Получить первый и последний элемент последовательности

15,17485,11075 
15,17485,11076 
15,17485,11077 
15,17485,11078 
15,17485,11079 
15,17485,11080 
15,17486,11068 
15,17486,11069 
15,17486,11070 
15,17486,11071 
15,17486,11072 
15,17486,11073 
15,17486,11074 
15,17486,11075 
15,17486,11076 
15,17486,11077 
15,17486,11078 
15,17486,11079 
15,17486,11080 
15,17487,11068 
15,17487,11069 
15,17487,11070 
15,17487,11071 
15,17487,11072 
15,17487,11073 
15,17487,11074 
15,17487,11075 
15,17487,11076 
15,17487,11077 
15,17487,11078 
15,17487,11079 

Я хочу, чтобы получить первый и последний элемент каждой последовательности , в третьем столбце и соответствующей записи во втором столбце, чтобы создать ограничительную шкатулу для рендеринга с mapnik. Я не хочу использовать mod_tile.

У меня нет проблем с извлечением из второго столбца:

for x_idx, row in enumerate(zoom_15): 
    this_Xelement = row 
    next_Xelement = zoom_15[(x_idx + 1) % len(zoom_15)] 
    X = int(next_Xelement[1]) - int(this_Xelement[1]) 
    x_start = 0 
    x_end = 0 
    y_end = 0 
    y_start = int(this_Xelement[2]) 
    if X == 0: 
     continue 
    elif X == 1: 
     x_start = int(this_Xelement[1]) 
     x_end = int(next_Xelement[1]) 
    elif X < 0: 
     x_start = int(this_Xelement[1]) 
     x_end = int(this_Xelement[1]) + 1 
    elif X > 1: 
     x_start = int(this_Xelement[1]) 
     x_end = int(this_Xelement[1]) + 1 

    print (x_start, x_end) 
    print "++++++++++++++++" 

создает некоторый вывод, как:

enter image description here

Но я не могу получить третий столбец итерации, чтобы получить правильные координаты ВВ. Im'working на Python 2.7

Update:

Я хочу, чтобы получить из everey последовательности первой и последней записи в нем. так из-за этого:

15,17485,11075 
15,17485,11076 
15,17485,11077 
15,17485,11078 
15,17485,11079 
15,17485,11080 

я хочу получить:

17485,11075 
17485,11080 

ответ

0
for x_idx, row in enumerate(zoom_15): 
    this_Xelement = row 
    next_Xelement = zoom_15[(x_idx + 1) % len(zoom_15)] 
    X = int(next_Xelement[1]) - int(this_Xelement[1]) 
    if X == 0: 
     continue 
    elif X == 1: 
     x_start = int(this_Xelement[1]) 
     x_end = int(next_Xelement[1]) 
     y_end = int(this_Xelement[2]) + 1 
     y_start = int(next_Xelement[2]) 
    elif X < 0: 
     x_start = int(this_Xelement[1]) 
     x_end = int(this_Xelement[1]) + 1 
     y_end = int(this_Xelement[2]) + 1 
    elif X > 1: 
     x_start = int(this_Xelement[1]) 
     x_end = int(this_Xelement[1]) + 1 
     y_end = int(this_Xelement[2]) + 1 
     y_start = int(next_Xelement[2]) 

    print(x_start, y_start) 
    print(x_end, y_end) 
    print "+++++++++++" 

это создает WAHT я хочу:

enter image description here

получил с помощью мои замечательные ученики. Спасибо за помощь!

0

Я не уверен, если я полностью понимаю ваш вопрос, но я думаю, что вы можете сделать что-то вроде этого:

firstRow = None 
lastRow = None 
with open('csvfile.csv','r') as file: 
    for line in file: 
     line = line.strip() 
     if len(line)==0: 
      continue # ignore empty lines, in case they exist 
     if firstRow is None: 
      firstRow = line.strip() # will only be updated once (in the first row) 
     lastRow = line.strip() # will be replaced every time (and only the last row will survive, in the end) 


for line in [firstRow,lastRow]: 
     items = line.split(',') 
     second_item = int(items[1]) 
     third_item = int(items[2]) 
     print (second_item,third_item) 

или использовать ту же стратегию в вашем коде:

firstRow = None 
lastRow = None 
for x_idx, row in enumerate(zoom_15):   
    this_Xelement = row 
    next_Xelement = zoom_15[(x_idx + 1) % len(zoom_15)] 
    X = int(next_Xelement[1]) - int(this_Xelement[1]) 
    x_start = 0 
    x_end = 0 
    y_end = 0 
    y_start = int(this_Xelement[2]) 
    if X == 0: 
     continue 
    elif X == 1: 
     x_start = int(this_Xelement[1]) 
     x_end = int(next_Xelement[1]) 
    elif X < 0: 
     x_start = int(this_Xelement[1]) 
     x_end = int(this_Xelement[1]) + 1 
    elif X > 1: 
     x_start = int(this_Xelement[1]) 
     x_end = int(this_Xelement[1]) + 1 
    if firstRow is None: 
     firstRow = (x_start, x_end) 
    lastRow = (x_start, x_end) 

print firstRow 
print lastRow 
print "++++++++++++++++" 
0

Я предлагаю использовать пакет pandas для этого, он имеет функцию read_csv, и у нее есть некоторые сильные инструменты обработки массива/таблицы.

Пример кода:

import pandas as pd 

data = pd.read_csv(myCsvFile, header=None) 
print(data.loc[:, 1:3]) # get all rows, columns >= 1 and < 3 

что приводит:

 1  2 
0 17485 11075 
1 17485 11076 
2 17485 11077 
3 17485 11078 
... 
27 17487 11076 
28 17487 11077 
29 17487 11078 
30 17487 11079