繁体   English   中英

如何读取特定数据并写入 csv 文件

[英]How to read specific data and write to csv file

我在 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

@kiric8494解决方案已经足够好了,你可以坚持下去。 你也可以使用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() ,它构造<row>的所有子节点的字典,其中键是标签值是文本


你可以帮助我的国家,查看我的个人资料信息

感谢@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(','))

我只是将值放在列表中并从中创建一个 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()所以您可能可以通过将 XML 直接读入 DataFrame 然后直接将其写入 CSV 来缩短它并避免使用 etree。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM