无法从 Python 中的 XML 文件中读取中文字符
Unable to read chinese character from XML file in Python
这是我的 xml
<?xml version="1.0" encoding="UTF-16" standalone="no"?>
<table rows="3" cols="8" style="" render="1" datatype="2" tabletype="dynamictable1int" primary="" assetClass="Fixed Income" bookName="2015-05-20 LM BW GFI_CN" languageCode="12" languageWord="Chinese">
<tbody>
<row condition="TCH">
<entry></entry>
<entry> 1 个月 </entry>
<entry> 3 个月 </entry>
<entry> 1 年 </entry>
<entry> 3 年 </entry>
<entry> 5 年 </entry>
<entry> 10 年 </entry>
<entry> 从创建之日起 </entry>
</row>
</tbody>
</table>
当我尝试 运行 通过这个 XMl 我得到的值时,
['1 个月', '3 个月', '1 年', '3 年', '5 年', '10 年', '从创建之日起']
我正在使用 python3、
table = XMLTable(xml, text_columns='ALL')
categoryNames = row2[0][1:]
当我试图找到 categoryNames 的类型时,我发现它正在返回 <class,'str'>
我希望这些字符以中文显示,因为我将它们用作我的条形图的类别名称,我正在使用 reportlab 生成图表。它呈现的值与我上面显示的值相同。当我 运行 使用 python 2.7 编写相同的代码时,它呈现得非常完美。
这是 XMLTable 的代码-
class XMLTable:
error = object() #unique
@verboseError
def __init__(self, xml, text_columns=[], floatDefault=0):
xml = xml.replace('<emphasis>','',1000)
xml = xml.replace('</emphasis>','',1000)
xml = xml.replace('<para>','',1000)
xml = xml.replace('</para>','',1000)
xml = xml.replace('<sub>','',1000)
xml = xml.replace('</sub>','',1000)
xml = xml.replace('<sup>','',1000)
xml = xml.replace('</sup>','',1000)
xml = xml.replace('<superscript>','',1000)
xml = xml.replace('</superscript>','',1000)
xml = xml.replace('<emphasis>','',1000)
xml = xml.replace('</emphasis>','',1000)
xml = xml.replace('<sbr>','',1000)
xml = xml.replace('</sbr>','',1000)
self.xml = xml
self.data = []
#print xml
#pdb.set_trace()
self.tree = pyRXPU.Parser().parse(xml)
self.tags = dict()
self.tags.update(self.tree[1])
self.tableTag = NonEscapingTagWrapper(self.tree)
if hasattr(self.tableTag, 'assetClass'):
self.assetClass = self.tableTag.assetClass
else:
self.assetClass = None
for i, row in enumerate(self.tableTag.tbody):
if hasattr(row, 'selrow') and row.selrow == '0': continue
newRow = []
for col_no, entry in enumerate(row):
if hasattr(entry, 'selcol') and entry.selcol == '0':
continue
value = stripTags(tt2xml(entry._children))
if text_columns != 'ALL':
if col_no not in text_columns:
v = re.sub(r"[^-\d\.]",'', value)
try:
value = float(v)
except ValueError:
if floatDefault is XMLTable.error:
annotateException('\nrow=%d col=%d value=%r cannot be converted to float' % (i,col_no,value))
else:
value = floatDefault
newRow.append(value)
self.data.append(newRow)
@verboseError
def getFormat(self, row, col):
value = str(self.tableTag.tbody[row][col])
return getNumberFormat(value)
@verboseError
def __len__(self):
return len(self.data)
@verboseError
def __iter__(self):
return self.data.__iter__()
@verboseError
def __getitem__(self, key):
if isinstance(key, int):
return self.data[key]
elif isinstance(key, slice):
return self.data[key]
else:
return self.tags[key]
@verboseError
def __setitem__(self, key, item):
if isinstance(key, int):
self.data[key] = item
elif isinstance(key, slice):
self.data[key] = item
else:
self.tags[key] = item
@verboseError
def __delitem__(self, key):
if isinstance(key, int):
del self.data[key]
elif isinstance(key, slice):
del self.data[key]
else:
del self.tags[key]
@verboseError
def keys(self):
return self.tags.keys()
@verboseError
def items(self):
return self.tags.items()
@verboseError
def get(self, key, default=None):
if key in self.tags.keys():
return self.tags[key]
if default:
return default
raise KeyError('there is no such key %s'%key)
@verboseError
def __str__(self):
return self.xml
@verboseError
def __repr__(self):
return str(self.tree)
@verboseError
def clean(self, remove_if_zeros=None):
for row in self.data:
if row[remove_if_zeros] == 0:
self.data.remove(row)
return self
您是否尝试过打开 xml 编码格式的文件?
例如。
文件名:abc.xml
xml = open(abc, encoding="utf-8").read()
这对我有用。
这是我的 xml
<?xml version="1.0" encoding="UTF-16" standalone="no"?>
<table rows="3" cols="8" style="" render="1" datatype="2" tabletype="dynamictable1int" primary="" assetClass="Fixed Income" bookName="2015-05-20 LM BW GFI_CN" languageCode="12" languageWord="Chinese">
<tbody>
<row condition="TCH">
<entry></entry>
<entry> 1 个月 </entry>
<entry> 3 个月 </entry>
<entry> 1 年 </entry>
<entry> 3 年 </entry>
<entry> 5 年 </entry>
<entry> 10 年 </entry>
<entry> 从创建之日起 </entry>
</row>
</tbody>
</table>
当我尝试 运行 通过这个 XMl 我得到的值时,
['1 个月', '3 个月', '1 年', '3 年', '5 年', '10 年', '从创建之日起']
我正在使用 python3、
table = XMLTable(xml, text_columns='ALL')
categoryNames = row2[0][1:]
当我试图找到 categoryNames 的类型时,我发现它正在返回 <class,'str'>
我希望这些字符以中文显示,因为我将它们用作我的条形图的类别名称,我正在使用 reportlab 生成图表。它呈现的值与我上面显示的值相同。当我 运行 使用 python 2.7 编写相同的代码时,它呈现得非常完美。
这是 XMLTable 的代码-
class XMLTable:
error = object() #unique
@verboseError
def __init__(self, xml, text_columns=[], floatDefault=0):
xml = xml.replace('<emphasis>','',1000)
xml = xml.replace('</emphasis>','',1000)
xml = xml.replace('<para>','',1000)
xml = xml.replace('</para>','',1000)
xml = xml.replace('<sub>','',1000)
xml = xml.replace('</sub>','',1000)
xml = xml.replace('<sup>','',1000)
xml = xml.replace('</sup>','',1000)
xml = xml.replace('<superscript>','',1000)
xml = xml.replace('</superscript>','',1000)
xml = xml.replace('<emphasis>','',1000)
xml = xml.replace('</emphasis>','',1000)
xml = xml.replace('<sbr>','',1000)
xml = xml.replace('</sbr>','',1000)
self.xml = xml
self.data = []
#print xml
#pdb.set_trace()
self.tree = pyRXPU.Parser().parse(xml)
self.tags = dict()
self.tags.update(self.tree[1])
self.tableTag = NonEscapingTagWrapper(self.tree)
if hasattr(self.tableTag, 'assetClass'):
self.assetClass = self.tableTag.assetClass
else:
self.assetClass = None
for i, row in enumerate(self.tableTag.tbody):
if hasattr(row, 'selrow') and row.selrow == '0': continue
newRow = []
for col_no, entry in enumerate(row):
if hasattr(entry, 'selcol') and entry.selcol == '0':
continue
value = stripTags(tt2xml(entry._children))
if text_columns != 'ALL':
if col_no not in text_columns:
v = re.sub(r"[^-\d\.]",'', value)
try:
value = float(v)
except ValueError:
if floatDefault is XMLTable.error:
annotateException('\nrow=%d col=%d value=%r cannot be converted to float' % (i,col_no,value))
else:
value = floatDefault
newRow.append(value)
self.data.append(newRow)
@verboseError
def getFormat(self, row, col):
value = str(self.tableTag.tbody[row][col])
return getNumberFormat(value)
@verboseError
def __len__(self):
return len(self.data)
@verboseError
def __iter__(self):
return self.data.__iter__()
@verboseError
def __getitem__(self, key):
if isinstance(key, int):
return self.data[key]
elif isinstance(key, slice):
return self.data[key]
else:
return self.tags[key]
@verboseError
def __setitem__(self, key, item):
if isinstance(key, int):
self.data[key] = item
elif isinstance(key, slice):
self.data[key] = item
else:
self.tags[key] = item
@verboseError
def __delitem__(self, key):
if isinstance(key, int):
del self.data[key]
elif isinstance(key, slice):
del self.data[key]
else:
del self.tags[key]
@verboseError
def keys(self):
return self.tags.keys()
@verboseError
def items(self):
return self.tags.items()
@verboseError
def get(self, key, default=None):
if key in self.tags.keys():
return self.tags[key]
if default:
return default
raise KeyError('there is no such key %s'%key)
@verboseError
def __str__(self):
return self.xml
@verboseError
def __repr__(self):
return str(self.tree)
@verboseError
def clean(self, remove_if_zeros=None):
for row in self.data:
if row[remove_if_zeros] == 0:
self.data.remove(row)
return self
您是否尝试过打开 xml 编码格式的文件? 例如。 文件名:abc.xml
xml = open(abc, encoding="utf-8").read()
这对我有用。