Создание 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.)
в одном ответе упоминается "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()
надеюсь, это поможет, если вы пытаетесь преобразовать свои данные.