#python #pandas #xml #csv #data-conversion
Вопрос:
Я конвертирую XML в CSV.
Для некоторых он хорошо пишет строки, но для других он ничего не пишет.
Ниже приведен мой код. Строки, которые пишутся, являются:
- Бренд
- Линия
- Имя
Другие строки-нет. Вы увидите в типе продукта, что я выполняю проверку и печатаю на консоли либо retail
или usage
, и это действительно печатает на консоли для каждого элемента. Это работает. однако это просто не запись данных. Я совершенно сбит с толку. Любой совет был бы очень признателен. Спасибо.
Вот код:
# Importing the required libraries
import xml.etree.ElementTree as Xet
import pandas as pd
productColumns = ["brand", "line", "name", "purpose", "retailPrice"]
rows = []
# Parsing the XML file
xmlparse = Xet.parse('xmlimportdata.xml')
root = xmlparse.getroot()
products = root.findall("productTableData")
for product in products:
# make sure a product and not a service (P vs S)
if product.find("productType").text == "P":
productBrand = product.find("Make")
if productBrand is not None:
productBrand = productBrand.text
else:
productBrand = "No Data"
productLine = product.find("Category")
if productLine is not None:
productLine = productLine.text
else:
productLine = "No Data"
productName = product.find("Name")
if productName is not None:
productName = productName.text
else:
productName = "No Data"
productType = product.find("usageType")
if productType is not None:
if productType.text == "true":
print('usage')
productType = "usage"
else:
productType = "retail"
print('retail')
else:
productType = "No Data"
productSize = product.find("Size")
if productSize is not None:
productSize = productSize.text
else:
productSize = "No Data"
productPrice = product.find("Retail")
if productPrice is not None:
productPrice = productPrice.text
else:
productPrice = "No Data"
productId = product.find("ID")
if productId is not None:
productId = productId.text
else:
productId = "No Data"
rows.append({"brand": productBrand,
"line": productLine,
"name": productName,
"type": productType,
"size": productSize,
"price": productPrice
})
# add data to pandas dataframe
df = pd.DataFrame(rows, columns=productColumns)
# Writing dataframe to csv
# note the columns = This little ripper will auto sort columns for us and place in correct order
df.to_csv('Converted-Products.csv', columns = productColumns, index = False)
Ответ №1:
Вам не нужно pandas
для этого преобразования. Оставьте большую библиотеку для анализа данных. Просто open
текстовый файл и используйте csv
пакет для writerows
. И используйте определенный метод, чтобы сохранить ваш код СУХИМ (D не R, а Y сами) с использованием тернарных операторов (т. Е. if
и else
в одной строке).
import csv
import xml.etree.ElementTree as Xet
elementColumns = ["ID", "Make", "Category", "Name", "usageType", "Size", "Retail"]
productColumns = ["id", "brand", "line", "name", "purpose", "size", "retailPrice"]
def get_text(elem, colname):
colElem = elem.find(colname)
colText = colElem.text if colElem is Not None else "No Data"
if col == "usageType" and colElem is Not None:
colText = "usage" if colElem.text == "true" else "retail"
return colText
# PARSE XML FILE
xmlparse = Xet.parse('xmlimportdata.xml')
root = xmlparse.getroot()
products = root.findall("productTableData")
# OPEN CSV FOR WRITING
with open("Output.csv", "wb") as f:
writer = csv.writer(f)
# HEADERS
writer.writerow(productColumns)
# ROWS
for product in products:
if product.find("productType").text == "P":
writer.writerow([
get_text(product, col)
for col in elementColumns
])
Комментарии:
1. Несмотря на то, что я понял это, я ценю работу, которую вы вложили в свой ответ, чтобы помочь мне узнать больше. Поэтому я отметил правильный ответ. Спасибо вам за потраченное время.
Ответ №2:
Обновление! Я нашел его. Rows.append не добавлял те же имена, что и строки, объявленные в productColumns в начале. Как только я сопоставил их, мы получили результат.