Создание kml из csv в Python

Я новичок в Python. Я работаю над файлами gps. Мне нужно преобразовать файл CSV, имеющий все данные gps, в файл kml. Ниже приведен код в python, который я использую:

import csv
#Input the file name.
fname = raw_input("Enter file name WITHOUT extension: ")
data = csv.reader(open(fname + '.csv'), delimiter = ',')
#Skip the 1st header row.
data.next()
#Open the file to be written.
f = open('csv2kml.kml', 'w')

#Writing the kml file.
f.write("<?xml version='1.0' encoding='UTF-8'?>n")
f.write("<kml xmlns='http://earth.google.com/kml/2.1'>n")
f.write("<Document>n")
f.write("   <name>" + fname + '.kml' +"</name>n")
for row in data:
    f.write("   <Placemark>n")
    f.write("       <name>" + str(row[1]) + "</name>n")
    f.write("       <description>" + str(row[0]) + "</description>n")
    f.write("       <Point>n")
    f.write("           <coordinates>" + str(row[3]) + "," + str(row[2]) + "," + str(row[4]) + "</coordinates>n")
    f.write("       </Point>n")
    f.write("   </Placemark>n")
f.write("</Document>n")
f.write("</kml>n")
print "File Created. "
print "Press ENTER to exit. "
raw_input()

csv-файл, который я использую, доступен здесь:dip12Sep11newEdited.csv Созданный файл kml доступен здесь:csv2kml.kml Но файл kml создается неправильно. Видимо, после некоторых строк в CSV-код не может генерировать больше меток. Его нет возможность перебора. Вы можете увидеть это, прокрутив последнюю часть созданного файла kml.

может ли кто-нибудь помочь мне найти ошибку в коде, потому что для некоторых небольших csv-файлов она работала правильно и создавала KML-файлы полностью.

спасибо.

5 ответов


вы не ответили на запрос выше, но я предполагаю, что ошибка заключается в том, что вы не закрываете свой выходной файл (который сбросит ваш вывод).

f.close()

используйте etree для создания файла

http://docs.python.org/library/xml.etree.elementtree.html

он включен в Python и защищает вас от генерации сломанного XML. (напр. потому что fname содержится &, что имеет особое значение в XML.)


Thie simplekml пакет работает очень хорошо, и делает легкую работу таких вещей.

чтобы установить на Ubuntu, загрузите последнюю версию и запустите следующее из каталога, содержащего содержимое архива.

sudo python setup.py install

также обучение чтобы вы начали.


в одном ответе упоминается "etree", одно преимущество, что вам не нужно жестко кодировать формат xml:

ниже одного из моих примеров, конечно, вы должны настроить его на свой случай, но вы можете получить принципиальное представление о том, как работает etree:

чтобы сделать что-то вроде этого

<OGRVRTDataSource>
 <OGRVRTLayer name="GW1AM2_201301010834_032D_L1SGRTBR_1110110_channel89H">
  <SrcDataSource>G:\AMSR\GW1AM2_201301010834_032D_L1SGRTBR_1110110_channel89H.csv</SrcDataSource>
  <GeometryType>wkbPoint</GeometryType>
  <GeometryField encoding="PointFromColumns" x="lon" y="lat" z="brightness" />
 </OGRVRTLayer>
</OGRVRTDataSource>

вы можете использовать этот код:

import xml.etree.cElementTree as ET
[....]
root = ET.Element("OGRVRTDataSource")

OGRVRTLayer  = ET.SubElement(root, "OGRVRTLayer")
OGRVRTLayer.set("name", AMSRcsv_shortname)

SrcDataSource = ET.SubElement(OGRVRTLayer, "SrcDataSource")
SrcDataSource.text = AMSRcsv

GeometryType = ET.SubElement(OGRVRTLayer, "GeometryType")
GeometryType.text = "wkbPoint"

GeometryField = ET.SubElement(OGRVRTLayer,"GeometryField")
GeometryField.set("encoding", "PointFromColumns")

GeometryField.set("x", "lon")
GeometryField.set("y", "lat")
GeometryField.set("z", "brightness")

tree = ET.ElementTree(root)
tree.write(AMSRcsv_vrt)

также дополнительная информация здесь


этот код хорошо написан спасибо за сообщение. Я заставил его работать, поместив мой CSV в тот же каталог, что и.код py.

Я сделал несколько изменений, чтобы довести его до py 3.3

import csv
#Input the file name."JoeDupes3_forearth"
fname = input("Enter file name WITHOUT extension: ")
data = csv.reader(open(fname + '.csv'), delimiter = ',')
#Skip the 1st header row.
#data.next()
#Open the file to be written.
f = open('csv2kml.kml', 'w')

#Writing the kml file.
f.write("<?xml version='1.0' encoding='UTF-8'?>\n")
f.write("<kml xmlns='http://earth.google.com/kml/2.1'>\n")
f.write("<Document>\n")
f.write("   <name>" + fname + '.kml' +"</name>\n")
for row in data:
    f.write("   <Placemark>\n")
    f.write("       <name>" + str(row[1]) + "</name>\n")
    f.write("       <description>" + str(row[3]) + "</description>\n")
    f.write("       <Point>\n")
    f.write("           <coordinates>" + str(row[10]) + "," + str(row[11]) + "," + str() + "</coordinates>\n")
    f.write("       </Point>\n")
    f.write("   </Placemark>\n")
f.write("</Document>\n")
f.write("</kml>\n")
print ("File Created. ")
print ("Press ENTER to exit. ")
input()
f.close()

надеюсь, это поможет, если вы пытаетесь преобразовать свои данные.