2015-11-16 4 views
1

Я пишу скрипт Python, который будет окрашиваться в различные области блочных групп переписей моего города (из них 18) разных цветов в соответствии с их соответствующими медианными доходами домашних хозяйств на карте, которая в формате SVG.Работа с SVG-контурами в BeautifulSoup & Python

Звучит достаточно просто, правильно? Ну, я не могу понять, как, хотя я немного продвигаюсь. То, что я пробовал до сих пор, составляет список каждого из путей групповой группы в соответствии с тем, как SVG ссылается на них, составляя список медианных доходов домохозяйства, а затем передавая код, который их окрашивает. Однако, это просто .. кажется, не работает, по какой-то причине. Может ли кто-нибудь из вас замечательных людей помочь выяснить, где я проваляюсь?

import csv 
from bs4 import BeautifulSoup 

icbg = [] 
reader = csv.reader(open('censusdata.csv'),delimiter=",") 

#read and get income 
for row in reader: 
    income = row[6] 
    income = int(income) 
    icbg.append(income) 

svg = open('NM2.svg','r') 
soup = BeautifulSoup(svg,"lxml") 

#find CBGs and incomes 
path1 = soup.find('path') 
path2 = path1.find_next('path') 
path3 = path2.find_next('path') 
path4 = path3.find_next('path') 
path5 = path4.find_next('path') 
path6 = path5.find_next('path') 
path7 = path6.find_next('path') 
path8 = path7.find_next('path') 
path9 = path8.find_next('path') 
path10 = path9.find_next('path') 
path11 = path10.find_next('path') 
path12 = path11.find_next('path') 
path13 = path12.find_next('path') 
path14 = path13.find_next('path') 
path15 = path14.find_next('path') 
path16 = path15.find_next('path') 
path17 = path16.find_next('path') 
path18 = path17.find_next('path') 
incomep1 = icbg[0] 
incomep2 = icbg[1] 
incomep3 = icbg[2] 
incomep4 = icbg[3] 
incomep5 = icbg[4] 
incomep6 = icbg[5] 
incomep7 = icbg[6] 
incomep8 = icbg[7] 
incomep9 = icbg[8] 
incomep10 = icbg[9] 
incomep11 = icbg[10] 
incomep12 = icbg[11] 
incomep13 = icbg[12] 
incomep14 = icbg[13] 
incomep15 = icbg[14] 
incomep16 = icbg[15] 
incomep17 = icbg[16] 
incomep18 = icbg[17] 

paths = (path1, path2, path3, path4, path5, path6, path7, path8, path9, path10, 
      path11, path12, path13, path14, path15, path16, path17, path18) 
incomes = (incomep1,incomep2,incomep3,incomep4,incomep5,incomep6,incomep7,incomep8, 
       incomep9,incomep10,incomep11,incomep12,incomep13,incomep14,incomep15,incomep16,incomep17,incomep18) 

#set colors 
colors = ['fee5d9','fcae91','fb6a4a','de2d26','a50f15'] 

for p in paths: 
    for i in range(0,17): 
     it = incomes[i] 
     if it > 20000: 
      color_class = 2 
     elif it > 25000: 
      color_class = 1 
     elif it > 30000: 
      color_class = 3 
     elif it > 35000: 
      color_class = 4 

     color = colors[color_class] 
     path_style = "font-size:12px;fill:#%s;fill-rule:nonzero;stroke:#000000;stroke-opacity:1;stroke-width:0.1;stroke-miterlimit:4;stroke-dasharray:none;stroke-linecap:butt;marker-start:none;stroke-linejoin:bevel" % color 
     p['style'] = path_style 
    print(soup.prettify()) 

Запуск это дает мне файл SVG как так: fill:#fb6a4a;fill-rule:nonzero;stroke:#000000;stroke-opacity:1;stroke-width:0.1;stroke-miterlimit:4;stroke-dasharray:none;stroke-linecap:butt;marker-start:none;stroke-linejoin:bevel"> придумывает 18 раз, то есть для каждого доступного пути, даже если эти пути имеют разные доходы.

может возникнуть проблема с тем, как я писал свои сравнения?

+2

Используйте списки, чтобы сохранить ваши пути и доходы с самого начала! Что-то вроде этого должно работать: 'paths [0] = soup.find ('path')' 'для x в диапазоне (1, 18): пути [x] = пути [x-1] .find_next (' path ') ' ' доходы = [icbg [x] для x в диапазоне (18)] ' –

+0

спасибо @ErikJohnson, я знал, что существует намного более питонический способ выполнения этого. mucho gracias – n1c9

ответ

1

Из моего понимания того, что вы пытаетесь сделать, ваша проблема в том, что у вас есть 2 for петель вместо одного. Вы должны одновременно прокладывать пути и доходы. То, как вы сейчас это делаете, - это перебирать все доходы для каждого пути. Следующий код просто перемещает пути в тот же цикл, что и доход, поэтому они зацикливаются в одно и то же время.

for i in range(0,17): 
    it = incomes[i] 
    p = paths[i] 
    if it > 20000: 
     color_class = 2 
    elif it > 25000: 
     color_class = 1 
    elif it > 30000: 
     color_class = 3 
    elif it > 35000: 
     color_class = 4 

    color = colors[color_class] 
    path_style = "font-size:12px;fill:#%s;fill-rule:nonzero;stroke:#000000;stroke-opacity:1;stroke-width:0.1;stroke-miterlimit:4;stroke-dasharray:none;stroke-linecap:butt;marker-start:none;stroke-linejoin:bevel" % color 
    p['style'] = path_style 
+0

Большое вам спасибо, dstudeba! – n1c9