Преобразование XML в CSV. Pandas to_csv не пишет одни строки, а пишет другие. Не могу его заметить

#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 в начале. Как только я сопоставил их, мы получили результат.