![](/img/trans.png)
[英]Read all CSV file in folder and read a content belong to specific header and write data to 1 CSV file
[英]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
以忽略除price
、 name
和calories
之外的所有字段,然后将生成器传递给.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.