从文件中删除<feff> </feff>

时间:2014-03-12 23:45:06

标签: python xml linux bash

我正在使用this Python脚本将CSV转换为XML。转换后,我看到文本中的标签(vim),这会导致XML解析错误。

enter image description here

我已经尝试过here的答案,但没有成功。

转换后的XML file

感谢您的帮助!

3 个答案:

答案 0 :(得分:7)

您的输入文件具有BOM(字节顺序标记)字符,并且当文件以utf8编码时,Python不会自动删除它们。请参阅:Reading Unicode file data with BOM chars in Python

>>> s = '\xef\xbb\xbfABC'
>>> s.decode('utf8')
u'\ufeffABC'
>>> s.decode('utf-8-sig')
u'ABC'

因此,针对您的具体情况,请尝试

from io import StringIO
s = StringIO(open(csvFile).read().decode('utf-8-sig'))
csvData = csv.reader(s)

非常糟糕的风格,但是这个剧本无论如何都是一个黑客攻击的剧本。

答案 1 :(得分:1)

将utf-8更改为 utf-8-sig

import csv
with open('example.txt', 'r', encoding='utf-8-sig') as file:

答案 2 :(得分:0)

以下是使用真正的XML感知库来运行类似转换的脚本示例。它没有完全相同的输出,但是,它是一个例子 - 盐味。

import csv
import lxml.etree

csvFile = 'myData.csv'
xmlFile = 'myData.xml'

reader = csv.reader(open(csvFile, 'r'))
with lxml.etree.xmlfile(xmlFile) as xf:
  xf.write_declaration(standalone=True)
  with xf.element('root'):
    for row in reader:
      row_el = lxml.etree.Element('row')
      for col in row:
        col_el = lxml.etree.SubElement(row_el, 'col')
        col_el.text = col
      xf.write(row_el)

要引用第2行第3列的内容,您可以使用类似/row[2]/col[3]/text()的XPath。