2011-09-23 7 views
8

में सीएसवी से किमीएल बनाएँ मैं पाइथन के लिए नया हूं। मैं जीपीएस फाइलों पर काम कर रहा हूं। मुझे एक सीएसवी फ़ाइल को सभी जीपीएस डेटा को kml फ़ाइल में परिवर्तित करने की आवश्यकता है। नीचे अजगर में कोड मैं का उपयोग कर रहा है:पायथन

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 फ़ाइल सही ढंग से नहीं बनाया जा रहा है। स्पष्ट रूप से सीएसवी में कुछ पंक्तियों के बाद कोड अधिक प्लेसमार्क उत्पन्न करने में सक्षम नहीं है। यह फिर से करने में सक्षम नहीं है। आप देख सकते हैं कि उत्पन्न kml फ़ाइल के अंतिम भाग तक स्क्रॉल करके।

क्या कोई मुझे कोड में त्रुटि का पता लगाने में मदद कर सकता है, क्योंकि कुछ छोटी सीएसवी फाइलों के लिए यह सही ढंग से काम करता है और पूरी तरह से kml फ़ाइलों को बनाता है।

धन्यवाद।

+0

आप कैसे जानते हैं कि यह अधिक प्लेमार्क्स उत्पन्न करने में सक्षम नहीं है?(क्या यह कभी भी 'फाइल बनाया गया' संकेत देता है?) – KevinDTimm

+0

हां यह 'फ़ाइल क्रिएट' को बढ़ावा देता है। लेकिन अगर आप नोटपैड में kml फ़ाइल खोलते हैं तो आप देख सकते हैं कि फ़ाइल पूरी तरह से नहीं लिखती है। – Darkpain

उत्तर

7

आप उपरोक्त प्रश्न का जवाब नहीं था, लेकिन मेरा अनुमान त्रुटि है कि है कि आप अपने आउटपुट फ़ाइल को बंद नहीं कर रहे हैं (जो फ्लश होता है आपका आउटपुट)।

f.close() 
+0

यदि आप kml फ़ाइल की जांच करते हैं तो आप देख सकते हैं कि यह अचानक समाप्त हो गया है। – Darkpain

+2

हां यह समस्या थी। बस f.close() जोड़ा और यह एक आकर्षण की तरह काम किया। बहुत बहुत धन्यवाद। – Darkpain

4

उपयोग etree अपनी फ़ाइल

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

यह अजगर के साथ शामिल और टूटी एक्सएमएल पैदा करने से बचाता है बनाने के लिए। (उदाहरण के लिए। क्योंकि fname& निहित है, जो एक्सएमएल में विशेष अर्थ नहीं है।)

1

Thie simplekml पैकेज बहुत अच्छी तरह से काम करता है, और इस तरह की चीजों के लिए आसान काम करता है।

उबंटू पर स्थापित करने के लिए, नवीनतम संस्करण डाउनलोड करें और संग्रह सामग्री वाले निर्देशिका से निम्न चलाएं।

sudo python setup.py install 

वहाँ भी some tutorials आप आरंभ करने के लिए कर रहे हैं।

0

यह कोड अच्छी तरह से लिखा गया है पोस्ट के लिए धन्यवाद। मुझे अपने सीएसवी को .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() 

आशा है कि यह मदद करता है अगर आप अपने डेटा कन्वर्ट करने के लिए कोशिश कर रहे हैं लाने के लिए कुछ संपादन कर दिया।

1

एक जवाब "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> 

की तरह कुछ पाने के लिए 210

कुछ और जानकारी here

+0

ध्यान दें कि मैंने इसे अधिक संक्षिप्त बनाने के लिए अपनी पोस्ट में सुधार किया है। कोई भी तत्व जहां आप केवल पाठ या एक विशेषता को सेट कर रहे हैं और उपखंड जोड़ने के लिए संदर्भ रखने की आवश्यकता नहीं है, एक पंक्ति में किया जा सकता है। उदाहरण के लिए: 'ET.SubElement (OGRVRTLayer," ज्यामिति टाइप ")। Text =" wkbPoint "' – ssokolow