简单的 CSV 到 XML 的转换 - Python

Posted

技术标签:

【中文标题】简单的 CSV 到 XML 的转换 - Python【英文标题】:Simple CSV to XML Conversion - Python 【发布时间】:2017-04-24 20:44:14 【问题描述】:

我正在寻找一种将 CSV 自动转换为 XML 的方法。

这是一个 CSV 文件的示例,其中包含电影列表:

这是 XML 格式的文件:

<collection shelf="New Arrivals">
<movietitle="Enemy Behind">
   <type>War, Thriller</type>
   <format>DVD</format>
   <year>2003</year>
   <rating>PG</rating>
   <stars>10</stars>
   <description>Talk about a US-Japan war</description>
</movie>
<movietitle="Transformers">
   <type>Anime, Science Fiction</type>
   <format>DVD</format>
   <year>1989</year>
   <rating>R</rating>
   <stars>8</stars>
   <description>A schientific fiction</description>
</movie>
<movietitle="Trigun">
   <type>Anime, Action</type>
   <format>DVD</format>
   <episodes>4</episodes>
   <rating>PG</rating>
   <stars>10</stars>
   <description>Vash the Stampede!</description>
</movie>
<movietitle="Ishtar">
   <type>Comedy</type>
   <format>VHS</format>
   <rating>PG</rating>
   <stars>2</stars>
   <description>Viewable boredom</description>
</movie>
</collection>

我尝试了一些示例,其中我能够使用 Python 使用 DOM 和 SAX 读取 csv 和 XML 格式,但我仍然找到了一个简单的转换示例。到目前为止,我有:

import csv              
f = open('movies2.csv')
csv_f = csv.reader(f)   

def convert_row(row):
   return """<movietitle="%s">
   <type>%s</type>
   <format>%s</format>
   <year>%s</year>
   <rating>%s</rating>
   <stars>%s</stars>
   <description>%s</description>
</movie>""" % (
   row.Title, row.Type, row.Format, row.Year, row.Rating, row.Stars, row.Description)

print ('\n'.join(csv_f.apply(convert_row, axis=1)))

但我得到了错误:

 File "moviesxml.py", line 16, in module
   print ('\n'.join(csv_f.apply(convert_row, axis=1)))
AttributeError: '_csv.reader' object has no attribute 'apply'

我对 Python 还是很陌生,因此非常感谢任何帮助!

我正在使用 Python 3.5.2。

谢谢!

丽莎

【问题讨论】:

请edit您的问题并包含您尝试过的Python代码。有用吗? 嗨,由于某种原因,我的 DOM 和 SAX 代码损坏了,我忘记了在哪里找到示例代码。我已经包含了导入 csv 方法 【参考方案1】:

一种可能的解决方案是先将 csv 加载到 Pandas 中,然后将其逐行转换为 XML,如下所示:

import pandas as pd
df = pd.read_csv('untitled.txt', sep='|')

将样本数据(假设分隔符等)加载为:

          Title                   Type Format  Year Rating  Stars  \
0  Enemy Behind           War,Thriller    DVD  2003     PG     10   
1  Transformers  Anime,Science Fiction    DVD  1989      R      9   

             Description  
0          Talk about...  
1  A Schientific fiction  

然后用自定义函数转换成xml:

def convert_row(row):
    return """<movietitle="%s">
    <type>%s</type>
    <format>%s</format>
    <year>%s</year>
    <rating>%s</rating>
    <stars>%s</stars>
    <description>%s</description>
</movie>""" % (
    row.Title, row.Type, row.Format, row.Year, row.Rating, row.Stars, row.Description)

print '\n'.join(df.apply(convert_row, axis=1))

这样你得到一个包含xml的字符串:

<movietitle="Enemy Behind">
    <type>War,Thriller</type>
    <format>DVD</format>
    <year>2003</year>
    <rating>PG</rating>
    <stars>10</stars>
    <description>Talk about...</description>
</movie>
<movietitle="Transformers">
    <type>Anime,Science Fiction</type>
    <format>DVD</format>
    <year>1989</year>
    <rating>R</rating>
    <stars>9</stars>
    <description>A Schientific fiction</description>
</movie>

您可以转储到文件或其他任何内容中。

灵感来自this great answer.


编辑:使用您发布的加载方法(或实际将数据加载到变量的版本):

import csv              
f = open('movies2.csv')
csv_f = csv.reader(f)   
data = []

for row in csv_f: 
   data.append(row)
f.close()

print data[1:]

我们得到:

[['Enemy Behind', 'War', 'Thriller', 'DVD', '2003', 'PG', '10', 'Talk about...'], ['Transformers', 'Anime', 'Science Fiction', 'DVD', '1989', 'R', '9', 'A Schientific fiction']]

我们可以稍加修改就转换成 XML:

def convert_row(row):
    return """<movietitle="%s">
    <type>%s</type>
    <format>%s</format>
    <year>%s</year>
    <rating>%s</rating>
    <stars>%s</stars>
    <description>%s</description>
</movie>""" % (row[0], row[1], row[2], row[3], row[4], row[5], row[6])

print '\n'.join([convert_row(row) for row in data[1:]])

得到相同的结果:

<movietitle="Enemy Behind">
    <type>War</type>
    <format>Thriller</format>
    <year>DVD</year>
    <rating>2003</rating>
    <stars>PG</stars>
    <description>10</description>
</movie>
<movietitle="Transformers">
    <type>Anime</type>
    <format>Science Fiction</format>
    <year>DVD</year>
    <rating>1989</rating>
    <stars>R</stars>
    <description>9</description>
</movie>

【讨论】:

为什么是熊猫? Python 标准库包含一个 CSV 模块。 @LutzHorn 没有特别的原因。 OP一开始没有具体说明是用什么方法来加载数据的,Pandas是我习惯的很棒的库。 您好,感谢您的帖子。我尝试使用“sudo pip install pandas”安装熊猫,但收到消息“ImportError: no module named 'pandas'” 另外(对不起,我是一个真正的新手)如何将其保存为 XML 文件 - movies.xml @LMarfell 我的错,应该是 with open('out.xml', 'w') as f: f.write('\n'.join([convert_row(row) for row in data]))

以上是关于简单的 CSV 到 XML 的转换 - Python的主要内容,如果未能解决你的问题,请参考以下文章

python [xml文件到voc的csv文件]将voc标签转换为xml格式为csv格式#python #csv #xml

将 CSV 文件转换为 XML

XML 到 CSV 格式

XML 到 CSV 的转换,如 MS Excel

XSLT - XML 到 CSV 将列转换为具有两种不同类型地址的行

在python中使用argparse将csv转换为xml