Priya R Priya R
Updated date Nov 09, 2023
In this blog, we will learn how to convert CSV data into XML format using Python. Explore multiple methods to achieve the conversion.

Introduction:

Data comes in various formats, and one of the most common data exchange formats is CSV (Comma-Separated Values), which is simple, lightweight, and widely supported. However, there are times when you may need to convert CSV data into XML (eXtensible Markup Language) format for compatibility with other systems or to take advantage of XML's hierarchical structure. In this blog, we will explore different methods for converting CSV to XML using Python.

Method 1: Using Python's Built-in csv and xml.etree.ElementTree Modules

To convert a CSV file to XML in Python, you can use the built-in csv and xml.etree.ElementTree modules. This method provides a simple and straightforward way to accomplish the task.

import csv
import xml.etree.ElementTree as ET

def csv_to_xml(csv_file, xml_file):
    # Create an XML root element
    root = ET.Element("data")

    with open(csv_file, "r") as csvfile:
        csv_reader = csv.reader(csvfile)
        header = next(csv_reader)
        for row in csv_reader:
            item = ET.SubElement(root, "item")
            for i, field in enumerate(row):
                ET.SubElement(item, header[i]).text = field

    # Create an ElementTree from the root
    tree = ET.ElementTree(root)
    tree.write(xml_file)

csv_to_xml("input.csv", "output_method1.xml")

In this method, we start by importing the necessary modules, csv and xml.etree.ElementTree. We define a function csv_to_xml that takes the input CSV file path and the desired XML file path as arguments. Inside the function, we create an XML root element and iterate through the CSV file to convert its data into XML format. The header of the CSV file is used as the XML element names, and each row is converted into an XML element under the root.

Output: 

<data>
    <item>
        <Name>John</Name>
        <Age>30</Age>
        <City>New York</City>
    </item>
    <item>
        <Name>Alice</Name>
        <Age>25</Age>
        <City>Los Angeles</City>
    </item>
</data>

Method 2: Using the pandas Library

Another method for converting CSV to XML involves using the popular pandas library, which provides powerful data manipulation and transformation capabilities.

import pandas as pd

def csv_to_xml_with_pandas(csv_file, xml_file):
    df = pd.read_csv(csv_file)
    xml_data = df.to_xml(root="data", row_name="item", header=False)

    with open(xml_file, "w") as xmlfile:
        xmlfile.write(xml_data)

csv_to_xml_with_pandas("input.csv", "output_method2.xml")

In this method, we first import the pandas library and define a function, csv_to_xml_with_pandas. Inside the function, we read the CSV file using pd.read_csv and then use the to_xml method to convert the DataFrame to an XML string. We specify the root element name and row element name in the to_xml function.

Output: 

<data>
    <item>
        <column_0>John</column_0>
        <column_1>30</column_1>
        <column_2>New York</column_2>
    </item>
    <item>
        <column_0>Alice</column_0>
        <column_1>25</column_1>
        <column_2>Los Angeles</column_2>
    </item>
</data>

Method 3: Using the xml.etree.ElementTree Module with Custom Element Names

If you want to specify custom element names for the XML output, you can use the xml.etree.ElementTree module in combination with a custom mapping of CSV columns to XML elements.

import csv
import xml.etree.ElementTree as ET

def csv_to_xml_custom(csv_file, xml_file, element_mapping):
    root = ET.Element("data")

    with open(csv_file, "r") as csvfile:
        csv_reader = csv.reader(csvfile)
        header = next(csv_reader)
        for row in csv_reader:
            item = ET.SubElement(root, "item")
            for i, field in enumerate(row):
                xml_element_name = element_mapping.get(header[i], header[i])
                ET.SubElement(item, xml_element_name).text = field

    tree = ET.ElementTree(root)
    tree.write(xml_file)

# Define a custom mapping of column names to XML element names
custom_mapping = {"Name": "PersonName", "Age": "PersonAge", "City": "PersonCity"}
csv_to_xml_custom("input.csv", "output_method3.xml", custom_mapping)

In this method, we introduce the element_mapping parameter, allowing you to define custom mappings for column names in the CSV to XML element names. This gives you more control over the structure of the resulting XML.

Output: 

<data>
    <item>
        <PersonName>John</PersonName>
        <PersonAge>30</PersonAge>
        <PersonCity>New York</PersonCity>
    </item>
    <item>
        <PersonName>Alice</PersonName>
        <PersonAge>25</PersonAge>
        <PersonCity>Los Angeles</PersonCity>
    </item>
</data>

Conclusion:

In this blog, we have covered three methods for converting CSV to XML, including using Python's built-in modules, pandas, and custom element mapping. Each method allows you to transform your data seamlessly, making it suitable for various applications and integrations.

Comments (0)

There are no comments. Be the first to comment!!!