【问题标题】:How to read specific data and write to csv file如何读取特定数据并写入csv文件
【发布时间】:2022-12-24 22:52:28
【问题描述】:

我在 xml 文件中有数据,我正在阅读 3 列:price , name , calories

XML数据


<?xml version='1.0' encoding='utf-8'?>
<data>
  <row>
    <index>0</index>
    <price>$5.95</price>
    <name>Belgian Waffles</name>
    <desc>Two of our famous Belgian Waffles with plenty of real maple syrup</desc>
    <calories>650</calories>
  </row>
  <row>
    <index>1</index>
    <price>$7.95</price>
    <name>Strawberry Belgian Waffles</name>
    <desc>Light Belgian waffles covered with strawberries and whipped cream</desc>
    <calories>900</calories>
  </row>
  <row>
    <index>2</index>
    <price>$8.95</price>
    <name>Berry-Berry Belgian Waffles</name>
    <desc>Light Belgian waffles covered with an assortment of fresh berries and whipped cream</desc>
    <calories>900</calories>
  </row>
  <row>
    <index>3</index>
    <price>$4.50</price>
    <name>French Toast</name>
    <desc>Thick slices made from our homemade sourdough bread</desc>
    <calories>600</calories>
  </row>
  <row>
    <index>4</index>
    <price>$6.95</price>
    <name>Homestyle Breakfast</name>
    <desc>Two eggs, bacon or sausage, toast, and our ever-popular hash browns</desc>
    <calories>950</calories>
  </row>
</data>

代码 :

import xml.etree.ElementTree as ET

parse_xml = ET.parse('/content/sample_data/xyz.xml')
get_root_element = parse_xml.getroot()


for data in get_root_element.findall('row'):

  prc = data.find('price')
  nm  = data.find('name')
  cal = data.find('calories')
  temp = prc.text + ',' +  nm.text + ',' + cal.text
  print(temp)

上面的代码给了我数据,但需要将这些数据存储到 csv 文件中

我需要如何为此编写逻辑。是否可以使用pandas / csv

还需要将我的标题添加到该 csv 文件中

标题:price , name , calories

【问题讨论】:

    标签: python pandas csv xml.etree


    【解决方案1】:

    @kiric8494Solution已经够用了,你可以留下来。您也可以使用 csv.DictWriter 来实现它,它会更短:

    import xml.etree.ElementTree as ET
    from csv import DictWriter
    
    parse_xml = ET.parse(r"/content/sample_data/xyz.xml")
    root = parse_xml.getroot()
    with open(r"/content/sample_data/abc.csv", "w", newline="") as f:
        writer = DictWriter(f, fieldnames=("price", "name", "calories"), extrasaction="ignore")
        writer.writeheader()
        writer.writerows({e.tag: e.text for e in row} for row in root)
    

    基本上我们设置DictWriter来忽略除pricenamecalories之外的所有字段,然后将生成器传递给.writerows(),它构造&lt;row&gt;的所有子节点的字典,其中关键是标签值为文本.

    【讨论】:

      【解决方案2】:

      感谢@ewz93 的解决方案

      我已经按照以下方式完成

      import xml.etree.ElementTree as ET
      import csv
      
      parse_xml = ET.parse('/content/sample_data/xyz.xml')
      get_root_element = parse_xml.getroot()
      
      final_data_set = [] # [ [],[],[] ]
      
      for data in get_root_element.findall('row'):
        temp = []
        prc = data.find('price')
        nm  = data.find('name')
        cal = data.find('calories')
        temp=[prc.text + ',' +  nm.text +  ',' + cal.text]
        final_data_set.append(temp)
      
      headers = ['price','name','calories']
      
      with open('/content/sample_data/abc.csv','w') as wr:
        csv_wr = csv.writer(wr)
        csv_wr.writerow(headers)
        for elem in final_data_set:
          for item in elem:
            csv_wr.writerow(item.split(','))
      

      【讨论】:

        【解决方案3】:

        我只是将值放在列表中并从中创建一个 DataFrame:

        import xml.etree.ElementTree as ET
        import pandas as pd
        
        parse_xml = ET.parse('/content/sample_data/xyz.xml')
        get_root_element = parse_xml.getroot()
        
        prc_list = []
        nm_list = []
        cal_list = []
        
        for data in get_root_element.findall('row'):
          prc_list.append(data.find('price'))
          nm_list.append(data.find('name'))
          cal_list.append(data.find('calories'))
        
        df = pd.DataFrame({"price": prc_list, "name": nm_list, "calories": cal_list})
        df.to_excel("your_file_name.xlsx") # or if you really want a CSV use df.to_csv("your_file_name.xlsx")
        

        这可能不是最漂亮的解决方案,因为还有 pandas.read_xml(),所以您可能可以缩短它并避免使用 etree,方法是直接将 XML 读入 DataFrame,然后直接将其写入 CSV。

        【讨论】:

        • 的确。使用read_xml 一个简单的单行代码:pd.read_xml("input.xml", xpath=".//row", parser="etree")[["price", "name", "calories"]].to_csv("output.csv")
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-10-14
        • 1970-01-01
        • 2020-05-07
        • 2022-01-18
        • 1970-01-01
        • 1970-01-01
        • 2019-09-30
        相关资源
        最近更新 更多