简单的 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