Python中的XML到CSV

 手机用户2502857517_939 发布于 2023-02-08 18:43

我在使用Python将XML文件转换为CSV时遇到了很多麻烦.我看了很多论坛,尝试了lxml和xmlutils.xml2csv,但我无法让它工作.这是来自Garmin GPS设备的GPS数据.

这是我的XML文件的样子,当然缩短了:



  
      2013-12-03T21:08:56Z
      
          
              0.0000000
              
          
          
              0.0000000
              
          
          
              0.2000000
              
          
      
  

我的大量XML文件中有几个trk标签,但我可以设法将它们分开 - 它们代表不同的"段"或GPS设备上的行程.我想要的只是一个CSV文件,其中包含以下内容:

LAT         LON         TIME         ELE
45.4...     -122.6...   2013-12...   0.00...
...         ...         ...          ...

这是我到目前为止的代码:

## Call libraries
import csv
from xmlutils.xml2csv import xml2csv

inputs = "myfile.xml"
output = "myfile.csv"

converter = xml2csv(inputs, output)
converter.convert(tag="WHATEVER_GOES_HERE_RENDERS_EMPTY_CSV")

这是另一种替代代码.它只输出一个没有数据的CSV文件,只输出标题latlon.

import csv
import lxml.etree

x = '''



  2013-12-03T21:08:56Z
  
    
      0.0000000
      
    
    
      0.0000000
      
    
    
      0.2000000
      
    
  


'''

with open('output.csv', 'w') as f:
    writer = csv.writer(f)
    writer.writerow(('lat', 'lon'))
    root = lxml.etree.fromstring(x)
    for trkpt in root.iter('trkpt'):
        row = trkpt.get('lat'), trkpt.get('lon')
        writer.writerow(row)

我该怎么做呢?请注意我是新手,所以更全面的解释会非常棒!

1 个回答
  • 这是一个命名空间的 XML文档.因此,您需要使用各自的命名空间来寻址节点.

    文档中使用的命名空间在顶部定义:

    xmlns:tc2="http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:tp1="http://www.garmin.com/xmlschemas/TrackPointExtension/v1"
    xmlns="http://www.topografix.com/GPX/1/1"
    

    所以第一个名称空间被映射到简短形式tc2,并将用在像这样的元素中<tc2:foobar/>.最后一个,在它之后没有简短形式xmlns,被称为默认命名空间,它适用于文档中没有明确使用命名空间的所有元素 - 因此它也适用于您的<trkpt />元素.

    因此,您需要编写root.iter('{http://www.topografix.com/GPX/1/1}trkpt')以选择这些元素.

    为了获得时间和高程,您可以使用trkpt.find()访问trkpt节点下面的这些元素,然后element.text检索这些元素的文本内容(而不是像lat和的属性lon).此外,因为timeele元素也使用默认命名空间,所以您必须{namespace}element再次使用语法来选择那些节点.

    所以你可以使用这样的东西:

    NS = 'http://www.topografix.com/GPX/1/1'
    header = ('lat', 'lon', 'ele', 'time')
    
    with open('output.csv', 'w') as f:
        writer = csv.writer(f)
        writer.writerow(header)
        root = lxml.etree.fromstring(x)
        for trkpt in root.iter('{%s}trkpt' % NS):
            lat = trkpt.get('lat')
            lon = trkpt.get('lon')
            ele = trkpt.find('{%s}ele' % NS).text
            time = trkpt.find('{%s}time' % NS).text
    
            row = lat, lon, ele, time
            writer.writerow(row)
    

    有关XML命名空间的更多信息,请参阅lxml教程中的命名空间部分和XML命名空间上的Wikipedia文章.有关格式的一些详细信息,请参阅GPS eXchange.gpx格式.

    2023-02-08 18:47 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有