Bioformats-Python error: 'ascii' codec can't encode character u'\xb5' when using OMEXML()
Bioformats-Python error: 'ascii' codec can't encode character u'\xb5' when using OMEXML()
我正在尝试使用 Python 中的生物格式来读取显微镜图像(.lsm、.czi、.lif,随你便),打印出元数据,并显示图像。 ome = bf.OMEXML(md)
给我一个错误(如下)。我认为它是在谈论 md
中存储的信息。它不喜欢 md
中的信息不全是 ASCII。但是我该如何克服这个问题呢?
这是我写的:
import Tkinter as Tk, tkFileDialog
import os
import javabridge as jv
import bioformats as bf
import matplotlib.pyplot as plt
import numpy as np
jv.start_vm(class_path=bf.JARS, max_heap_size='12G')
用户选择要使用的文件
#hiding root alllows file diaglog GUI to be shown without any other GUI elements
root = Tk.Tk()
root.withdraw()
file_full_path = tkFileDialog.askopenfilename()
filepath, filename = os.path.split(file_full_path)
os.chdir(os.path.dirname(file_full_path))
print('opening: %s' %filename)
reader = bf.ImageReader(file_full_path)
md = bf.get_omexml_metadata(file_full_path)
ome = bf.OMEXML(md)
将图像放入 numpy 数组
raw_data = []
for z in range(iome.Pixels.get_SizeZ()):
raw_image = reader.read(z=z, series=0, rescale=False)
raw_data.append(raw_image)
raw_data = np.array(raw_data)
显示需要的元数据
iome = ome.image(0) # e.g. first image
print(iome.get_Name())
print(iome.Pixels.get_SizeX())
print(iome.Pixels.get_SizeY())
这是我得到的错误:
---------------------------------------------------------------------------
UnicodeEncodeError Traceback (most recent call last)
<ipython-input-22-a22c1dbbdd1e> in <module>()
11 reader = bf.ImageReader(file_full_path)
12 md = bf.get_omexml_metadata(file_full_path)
---> 13 ome = bf.OMEXML(md)
/anaconda/envs/env2_bioformats/lib/python2.7/site-packages/bioformats/omexml.pyc in __init__(self, xml)
318 if isinstance(xml, str):
319 xml = xml.encode("utf-8")
--> 320 self.dom = ElementTree.ElementTree(ElementTree.fromstring(xml))
321
322 # determine OME namespaces
<string> in XML(text)
UnicodeEncodeError: 'ascii' codec can't encode character u'\xb5' in position 1623: ordinal not in range(128)
这是具有专有显微镜格式的代表test image
感谢您添加示例图片。这帮了大忙!
让我们首先删除所有不必要的 Tkinter 代码,直到我们得到一个 Minimal, Complete and Verifiable Example 允许我们重现您的错误消息。
import javabridge as jv
import bioformats as bf
jv.start_vm(class_path=bf.JARS, max_heap_size='12G')
file_full_path = '/path/to/Cell1.lsm'
md = bf.get_omexml_metadata(file_full_path)
ome = bf.OMEXML(md)
jv.kill_vm()
我们首先收到一些关于 3i SlideBook SlideBook6Reader library not found
的警告消息,但我们 can apparently ignore 那。
您的错误消息显示为 UnicodeEncodeError: 'ascii' codec can't encode character u'\xb5' in position 1623: ordinal not in range(128)
,所以让我们看看在位置 1623 附近可以找到什么。
如果在 md = bf.get_omexml_metadata(file_full_path)
之后添加 print md
,则会打印出带有元数据的整个 xml。让我们放大:
>>> print md[1604:1627]
PhysicalSizeXUnit="µm"
所以,µ
字符是罪魁祸首,它不能用 'ascii' codec
编码。
回顾回溯:
/anaconda/envs/env2_bioformats/lib/python2.7/site-packages/bioformats/omexml.pyc in __init__(self, xml)
318 if isinstance(xml, str):
319 xml = xml.encode("utf-8")
--> 320 self.dom = ElementTree.ElementTree(ElementTree.fromstring(xml))
321
322 # determine OME namespaces
我们看到在错误发生之前的行中,我们将 xml
编码为 utf-8
,这应该可以解决我们的问题。那为什么没有发生呢?
如果我们添加 print type(md)
,我们会返回 <type 'unicode'>
而不是代码预期的 <type 'str'>
。所以这是 omexml.py
中的错误!
要解决此问题,请执行以下操作(您可能需要是 root);
- 转到
/anaconda/envs/env2_bioformats/lib/python2.7/site-packages/bioformats/
- 移除
omexml.pyc
- 在
omexml.py
中将第 318 行从 isinstance(xml, str):
更改为 if isinstance(xml, basestring):
basestring
是 str
和 unicode
的超类。它用于测试一个对象是否是str
或unicode
的实例。
我想为此提交一个错误,但似乎已经有一个 open issue。
我正在尝试使用 Python 中的生物格式来读取显微镜图像(.lsm、.czi、.lif,随你便),打印出元数据,并显示图像。 ome = bf.OMEXML(md)
给我一个错误(如下)。我认为它是在谈论 md
中存储的信息。它不喜欢 md
中的信息不全是 ASCII。但是我该如何克服这个问题呢?
这是我写的:
import Tkinter as Tk, tkFileDialog
import os
import javabridge as jv
import bioformats as bf
import matplotlib.pyplot as plt
import numpy as np
jv.start_vm(class_path=bf.JARS, max_heap_size='12G')
用户选择要使用的文件
#hiding root alllows file diaglog GUI to be shown without any other GUI elements
root = Tk.Tk()
root.withdraw()
file_full_path = tkFileDialog.askopenfilename()
filepath, filename = os.path.split(file_full_path)
os.chdir(os.path.dirname(file_full_path))
print('opening: %s' %filename)
reader = bf.ImageReader(file_full_path)
md = bf.get_omexml_metadata(file_full_path)
ome = bf.OMEXML(md)
将图像放入 numpy 数组
raw_data = []
for z in range(iome.Pixels.get_SizeZ()):
raw_image = reader.read(z=z, series=0, rescale=False)
raw_data.append(raw_image)
raw_data = np.array(raw_data)
显示需要的元数据
iome = ome.image(0) # e.g. first image
print(iome.get_Name())
print(iome.Pixels.get_SizeX())
print(iome.Pixels.get_SizeY())
这是我得到的错误:
---------------------------------------------------------------------------
UnicodeEncodeError Traceback (most recent call last)
<ipython-input-22-a22c1dbbdd1e> in <module>()
11 reader = bf.ImageReader(file_full_path)
12 md = bf.get_omexml_metadata(file_full_path)
---> 13 ome = bf.OMEXML(md)
/anaconda/envs/env2_bioformats/lib/python2.7/site-packages/bioformats/omexml.pyc in __init__(self, xml)
318 if isinstance(xml, str):
319 xml = xml.encode("utf-8")
--> 320 self.dom = ElementTree.ElementTree(ElementTree.fromstring(xml))
321
322 # determine OME namespaces
<string> in XML(text)
UnicodeEncodeError: 'ascii' codec can't encode character u'\xb5' in position 1623: ordinal not in range(128)
这是具有专有显微镜格式的代表test image
感谢您添加示例图片。这帮了大忙!
让我们首先删除所有不必要的 Tkinter 代码,直到我们得到一个 Minimal, Complete and Verifiable Example 允许我们重现您的错误消息。
import javabridge as jv
import bioformats as bf
jv.start_vm(class_path=bf.JARS, max_heap_size='12G')
file_full_path = '/path/to/Cell1.lsm'
md = bf.get_omexml_metadata(file_full_path)
ome = bf.OMEXML(md)
jv.kill_vm()
我们首先收到一些关于 3i SlideBook SlideBook6Reader library not found
的警告消息,但我们 can apparently ignore 那。
您的错误消息显示为 UnicodeEncodeError: 'ascii' codec can't encode character u'\xb5' in position 1623: ordinal not in range(128)
,所以让我们看看在位置 1623 附近可以找到什么。
如果在 md = bf.get_omexml_metadata(file_full_path)
之后添加 print md
,则会打印出带有元数据的整个 xml。让我们放大:
>>> print md[1604:1627]
PhysicalSizeXUnit="µm"
所以,µ
字符是罪魁祸首,它不能用 'ascii' codec
编码。
回顾回溯:
/anaconda/envs/env2_bioformats/lib/python2.7/site-packages/bioformats/omexml.pyc in __init__(self, xml)
318 if isinstance(xml, str):
319 xml = xml.encode("utf-8")
--> 320 self.dom = ElementTree.ElementTree(ElementTree.fromstring(xml))
321
322 # determine OME namespaces
我们看到在错误发生之前的行中,我们将 xml
编码为 utf-8
,这应该可以解决我们的问题。那为什么没有发生呢?
如果我们添加 print type(md)
,我们会返回 <type 'unicode'>
而不是代码预期的 <type 'str'>
。所以这是 omexml.py
中的错误!
要解决此问题,请执行以下操作(您可能需要是 root);
- 转到
/anaconda/envs/env2_bioformats/lib/python2.7/site-packages/bioformats/
- 移除
omexml.pyc
- 在
omexml.py
中将第 318 行从isinstance(xml, str):
更改为if isinstance(xml, basestring):
basestring
是 str
和 unicode
的超类。它用于测试一个对象是否是str
或unicode
的实例。
我想为此提交一个错误,但似乎已经有一个 open issue。