【问题标题】:XML to df, AttributeError: 'NoneType' object has no attribute 'text'XML 到 df,AttributeError:“NoneType”对象没有属性“文本”
【发布时间】:2022-01-19 21:39:20
【问题描述】:

我正在将 xml 文件转换为 csv。我发现我无法将.text 用于elem。它说:

AttributeError: 'NoneType' 对象没有属性 'text'

cols = ["fieldDeviceID", "lastUpdateTime", "locStatus", "deviceStatus",
       "owningAgencyID", "locationTimeStamp", "volume", "occupancy", "speed", "detectorizationRatio"]
rows = []

with gzip.open(gz_files[1], 'rb') as f:
    tree = ET.parse(f)
    root = tree.getroot()
    for elem in root.iter():
        fieldDeviceID = elem.find("fieldDeviceID").text
        lastUpdateTime = elem.find("lastUpdateTime").text
        locStatus = elem.find("locStatus").text
        deviceStatus = elem.find("deviceStatus").text
        owningAgencyID = elem.find("owningAgencyID").text
        locationTimeStamp = elem.find("locationTimeStamp").text
        volume = elem.find("volume").text
        occupancy = elem.find("occupancy").text
        speed = elem.find("speed").text
        detectorizationRatio = elem.find("detectorizationRatio").text
  
        rows.append({"fieldDeviceID": fieldDeviceID,
                 "lastUpdateTime": lastUpdateTime, 
                 "locStatus": locStatus, 
                 "deviceStatus": deviceStatus,
                 "owningAgencyID": owningAgencyID, 
                 "locationTimeStamp": locationTimeStamp, 
                 "volume": volume, 
                 "occupancy": occupancy,
                 "speed": speed, 
                 "detectorizationRatio": detectorizationRatio})
    

df = pd.DataFrame(rows, columns=cols)

我该如何解决?

【问题讨论】:

  • 如果 elem.find('...') 没有找到任何东西,它会返回 none,当您执行 None.text 时会发生什么?你得到一个错误。

标签: python pandas xml parsing


【解决方案1】:

我解决了自己的问题。这是代码。

cols = ["fieldDeviceID", "lastUpdateTime", "locStatus", "deviceStatus",
       "owningAgencyID", "locationTimeStamp", "volume", "occupancy", "speed", "detectorizationRatio"]
rows = []

with gzip.open(gz_files[1], 'rb') as f:
    tree = ET.parse(f)
    root = tree.getroot()
    for elem in root.iter():
        if elem.find("fieldDeviceID") != None:
            fieldDeviceID = elem.find("fieldDeviceID").text
            
        if elem.find("lastUpdateTime") != None:
            lastUpdateTime = elem.find("lastUpdateTime").text
            
        if elem.find("locStatus") != None:
            locStatus = elem.find("locStatus").text
            
        if elem.find("deviceStatus") != None:
            deviceStatus = elem.find("deviceStatus").text
            
        if elem.find("owningAgencyID") != None:
            owningAgencyID = elem.find("owningAgencyID").text
            
        if elem.find("locationTimeStamp") != None:
            locationTimeStamp = elem.find("locationTimeStamp").text
            
        if elem.find("volume") != None:
            volume = elem.find("volume").text
            
        if elem.find("occupancy") != None:
            occupancy = elem.find("occupancy").text
            
        if elem.find("speed") != None:
            speed = elem.find("speed").text
            
        if elem.find("detectorizationRatio") != None:
            detectorizationRatio = elem.find("detectorizationRatio").text
        
  
        rows.append({"fieldDeviceID": fieldDeviceID,
                 "lastUpdateTime": lastUpdateTime, 
                 "locStatus": locStatus, 
                 "deviceStatus": deviceStatus,
                 "owningAgencyID": owningAgencyID, 
                 "locationTimeStamp": locationTimeStamp, 
                 "volume": volume, 
                 "occupancy": occupancy,
                 "speed": speed, 
                 "detectorizationRatio": detectorizationRatio})
    

df = pd.DataFrame(rows, columns=cols)

可能代码可以更简洁。

【讨论】:

    【解决方案2】:

    这是我得到的最终版本。

    with gzip.open(file, 'rb') as f:
        tree = ET.parse(f)
        VDSReport = tree.getroot()
        for elem in VDSReport:
            parent = elem.find("parent")
            
            fieldDeviceID = parent.find("fieldDeviceID").text
            lastUpdateTime = parent.find("lastUpdateTime").text
            locStatus = parent.find("locStatus").text
            deviceStatus = parent.find("deviceStatus").text
            owningAgencyID = parent.find("owningAgencyID").text
            locationTimeStamp = parent.find("locationTimeStamp").text
            
            volume = elem.find("volume").text
            occupancy = elem.find("occupancy").text
            speed = elem.find("speed").text
            detectorizationRatio = elem.find("detectorizationRatio").text
            
            rows.append({"fieldDeviceID": fieldDeviceID,
                     "lastUpdateTime": lastUpdateTime, 
                     "locStatus": locStatus, 
                     "deviceStatus": deviceStatus,
                     "owningAgencyID": owningAgencyID, 
                     "locationTimeStamp": locationTimeStamp, 
                     "volume": volume, 
                     "occupancy": occupancy,
                     "speed": speed, 
                     "detectorizationRatio": detectorizationRatio})
    

    【讨论】:

    • 您的答案可以通过添加有关代码的作用以及它如何帮助 OP 的更多信息来改进。
    猜你喜欢
    • 2016-12-29
    • 1970-01-01
    • 2018-11-12
    • 2021-06-05
    • 2019-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多