Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python条件XML编写_Python_Xml - Fatal编程技术网

Python条件XML编写

Python条件XML编写,python,xml,Python,Xml,我正在使用Python将CSV文件转换为XML格式。CSV文件有不同数量的行,范围从2到无限,包括标题。实际上是10-15,但除非有一些主要的性能问题,我想介绍一下我的基础,以便转换文件,我有以下代码: 对于csvData中的行: 如果rowNum==0: xmlData。写入“”+\n 标记=行 替换标记名中带下划线的空格 对于rangelentags中的i: 标记[i]=标记[i]。替换“”,'' 如果rowNum==1: 对于rangelentags中的i: xmlData.write“”

我正在使用Python将CSV文件转换为XML格式。CSV文件有不同数量的行,范围从2到无限,包括标题。实际上是10-15,但除非有一些主要的性能问题,我想介绍一下我的基础,以便转换文件,我有以下代码:

对于csvData中的行: 如果rowNum==0: xmlData。写入“”+\n 标记=行 替换标记名中带下划线的空格 对于rangelentags中的i: 标记[i]=标记[i]。替换“”,'' 如果rowNum==1: 对于rangelentags中的i: xmlData.write“”+\ +行[i]++\n xmlData.write'+\n+'+\n 如果rowNum==2: 对于rangelentags中的i: xmlData.write“”+\ +行[i]++\n xmlData。写入“”+\n 如果rowNum==3: 对于rangelentags中的i: xmlData.write+\n+''+\ +行[i]++\n xmlData。写入“”+\n rowNum+=1 xmlData.write+\n xmlData.close 如您所见,如果行存在,我将上层标记设置为手动创建。有没有更有效的方法来实现我创建标记的目标,而不是重复我的代码15次以上?谢谢

我将使用或来编写XML。xml.etree.ElementTree位于标准库中,但没有内置的打印功能。但是,您可以从中使用缩进函数

etree是一个第三方模块,但它在tostring方法中内置了漂亮的打印

使用lxml.etree,您可以执行以下操作:

import lxml.etree as ET

csvData = [['foo bar', 'baz quux'],['bing bang', 'bim bop', 'bip burp'],]
csvFile = 'rowboat'
name = csvFile[:-4]
root = ET.Element('csv_data')
for num, tags in enumerate(csvData):
    row = ET.SubElement(root, '{f}-{n}'.format(f = name, n = num))
    for text in tags:
        text = text.replace(' ', '_')
        tag = ET.SubElement(row, text)
        tag.text = text

print(ET.tostring(root, pretty_print = True))
屈服

<csv_data>
  <row-0>
    <foo_bar>foo_bar</foo_bar>
    <baz_quux>baz_quux</baz_quux>
  </row-0>
  <row-1>
    <bing_bang>bing_bang</bing_bang>
    <bim_bop>bim_bop</bim_bop>
    <bip_burp>bip_burp</bip_burp>
  </row-1>
</csv_data>
而是说

for tag in tags:
循环标记中的所有项目

也不是通过循环手动计算时间,而是使用

num = 0
for tags in csvData:
    num += 1
而是使用以下功能:

for num, tags in enumerate(csvData):
弦状

'        ' + '<' + tags[i] + '>' \
                         + row[i] + '</' + tags[i] + '>' + "\n"
非常难读。它把逻辑混合在一起 缩进,带有标记的XML语法,以及 行字符。这就是xml.etree.ElementTree或lxml.etree的位置 我会帮助你的。它将负责XML的序列化 你您只需要提供XML元素之间的关系。 代码将更具可读性,更易于维护

我将使用或来编写XML。xml.etree.ElementTree位于标准库中,但没有内置的打印功能。但是,您可以从中使用缩进函数

etree是一个第三方模块,但它在tostring方法中内置了漂亮的打印

使用lxml.etree,您可以执行以下操作:

import lxml.etree as ET

csvData = [['foo bar', 'baz quux'],['bing bang', 'bim bop', 'bip burp'],]
csvFile = 'rowboat'
name = csvFile[:-4]
root = ET.Element('csv_data')
for num, tags in enumerate(csvData):
    row = ET.SubElement(root, '{f}-{n}'.format(f = name, n = num))
    for text in tags:
        text = text.replace(' ', '_')
        tag = ET.SubElement(row, text)
        tag.text = text

print(ET.tostring(root, pretty_print = True))
屈服

<csv_data>
  <row-0>
    <foo_bar>foo_bar</foo_bar>
    <baz_quux>baz_quux</baz_quux>
  </row-0>
  <row-1>
    <bing_bang>bing_bang</bing_bang>
    <bim_bop>bim_bop</bim_bop>
    <bip_burp>bip_burp</bip_burp>
  </row-1>
</csv_data>
而是说

for tag in tags:
循环标记中的所有项目

也不是通过循环手动计算时间,而是使用

num = 0
for tags in csvData:
    num += 1
而是使用以下功能:

for num, tags in enumerate(csvData):
弦状

'        ' + '<' + tags[i] + '>' \
                         + row[i] + '</' + tags[i] + '>' + "\n"
非常难读。它把逻辑混合在一起 缩进,带有标记的XML语法,以及 行字符。这就是xml.etree.ElementTree或lxml.etree的位置 我会帮助你的。它将负责XML的序列化 你您只需要提供XML元素之间的关系。 代码将更具可读性,更易于维护


反应很好,谢谢!我的代码一分钟比一分钟干净!反应很好,谢谢!我的代码一分钟比一分钟干净!