Python UnicodeDecodeError:&x27;ascii';编解码器可以';t解码从pyvisa设备读取的字符串

Python UnicodeDecodeError:&x27;ascii';编解码器可以';t解码从pyvisa设备读取的字符串,python,encoding,utf-8,Python,Encoding,Utf 8,所以我使用pyvisa让python与一些工具进行对话。我有这样的代码: self.receiver.write("mmem:data? \'traceData.DAT\'") sleep(2) data_string = self.receiver_visa.read() '#525817Type;ESU;\r\nVersion;4.73;\r\nDate;10.May 17;\r\nMode;ANALYZER;\r\nCenter Freq;13560000.000

所以我使用pyvisa让python与一些工具进行对话。我有这样的代码:

    self.receiver.write("mmem:data? \'traceData.DAT\'")
    sleep(2)
    data_string = self.receiver_visa.read()
'#525817Type;ESU;\r\nVersion;4.73;\r\nDate;10.May 17;\r\nMode;ANALYZER;\r\nCenter Freq;13560000.000000;Hz\r\nFreq Offset;0.000000;Hz\r\nSpan;1000000.000000;Hz\r\nx-Axis;LIN;\r\nStart;13060000.000000;Hz\r\nStop;14060000.000000;Hz\r\nRef Level;-36.000000;dBm\r\nLevel Offset;0.000000;dB\r\nRef Position;100.000000;%\r\ny-Axis;LOG;\r\nLevel Range;100.000000;dB\r\nRf Att;10.000000;dB\r\nRBW;10000.000000;Hz\r\nVBW;30000.000000;Hz\r\nSWT;0.040000;s\r\nTrace Mode;CLR/WRITE;\r\nDetector;MAXPEAK;\r\nSweep Count;0;\r\nTrace 1:;;\r\nx-Unit;Hz;\r\ny-Unit;dBm;\r\nPreamplifier;NOT AVAILABLE;\r\nTransducer;OFF;\r\nValues;625;\r\n13060000;-101.74840545654297;\r\n13061602.564102564;-102.10520935058594;\r\n13063205.128205128;-105.79591369628906;\r\n13064807.692307692;-111.44921875;\r\n13066410.256410256;-106.73763275146484;\r\n13068012.82051282;-105.97975158691406;\r\n13069615.384615384;-103.39719390869....
写入部分是告诉仪器在哪里找到数据,并等待2秒,然后使用read()实际读取该数据。数据应如下所示:

    self.receiver.write("mmem:data? \'traceData.DAT\'")
    sleep(2)
    data_string = self.receiver_visa.read()
'#525817Type;ESU;\r\nVersion;4.73;\r\nDate;10.May 17;\r\nMode;ANALYZER;\r\nCenter Freq;13560000.000000;Hz\r\nFreq Offset;0.000000;Hz\r\nSpan;1000000.000000;Hz\r\nx-Axis;LIN;\r\nStart;13060000.000000;Hz\r\nStop;14060000.000000;Hz\r\nRef Level;-36.000000;dBm\r\nLevel Offset;0.000000;dB\r\nRef Position;100.000000;%\r\ny-Axis;LOG;\r\nLevel Range;100.000000;dB\r\nRf Att;10.000000;dB\r\nRBW;10000.000000;Hz\r\nVBW;30000.000000;Hz\r\nSWT;0.040000;s\r\nTrace Mode;CLR/WRITE;\r\nDetector;MAXPEAK;\r\nSweep Count;0;\r\nTrace 1:;;\r\nx-Unit;Hz;\r\ny-Unit;dBm;\r\nPreamplifier;NOT AVAILABLE;\r\nTransducer;OFF;\r\nValues;625;\r\n13060000;-101.74840545654297;\r\n13061602.564102564;-102.10520935058594;\r\n13063205.128205128;-105.79591369628906;\r\n13064807.692307692;-111.44921875;\r\n13066410.256410256;-106.73763275146484;\r\n13068012.82051282;-105.97975158691406;\r\n13069615.384615384;-103.39719390869....
但是当我运行这段代码时,我收到一条错误消息说

UnicodeDecodeError:“ascii”编解码器无法解码位置中的字节0xe6 243:序号不在范围内(128)

所以我认为问题在于python没有使用utf-8。我试着把

#!/usr/bin/env python
# -*- coding: utf-8 -*-
在源代码头上,但这没有帮助。我做了一些研究,有些人建议使用string.decode('utf-8'),但这对我来说不起作用,因为我直接从pyvisa设备读取数据。有人能帮忙吗

短暂性脑缺血发作

附件是完整的回溯:

>>> import pyvisa
>>> rm = pyvisa.ResourceManager()
>>> rm.list_resources()
('TCPIP0::178.168.48.147::inst0::INSTR', 'TCPIP0::178.168.48.21::inst0::INSTR', 'TCPIP0::178.168.48.30::inst0::INSTR', 'ASRL10::INSTR', 'GPIB0::5::INSTR', 'GPIB0::20::INSTR')
>>> maturo = rm.open_resource('GPIB0::20::INSTR')
>>> esu = rm.open_resource('GPIB0::20::INSTR')
>>> esu.query("*IDN?")
'Rohde&Schwarz,ESU-40,100348/040,4.73\n'
>>> esu.write("mmem:del \'traceData.DAT\'")
(26, <StatusCode.success: 0>)
>>> esu.write("mmem:cdir \'D:\'")
(16, <StatusCode.success: 0>)
>>> esu.write("hcop:dev:lang DAT")
(19, <StatusCode.success: 0>)
>>> esu.write("hcop:dest \'mmem\'")
(18, <StatusCode.success: 0>)
>>> esu.write("mmem:stor:trac 1,\'traceData.DAT\'")
(34, <StatusCode.success: 0>)
>>> esu.write("mmem:data? \'traceData.DAT\'")
(28, <StatusCode.success: 0>)
>>> esu.read()
Traceback (most recent call last):
  File "<pyshell#12>", line 1, in <module>
    esu.read()
  File "C:\Users\hansong.li\AppData\Local\Programs\Python\Python35-32\lib\site-packages\pyvisa\resources\messagebased.py", line 332, in read
    message = self.read_raw().decode(enco)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in position 241: ordinal not in range(128)
>>导入pyvisa
>>>rm=pyvisa.ResourceManager()
>>>rm.list_资源()
('TCPIP0::178.168.48.147::inst0::INSTR','TCPIP0::178.168.48.21::inst0::INSTR','TCPIP0::178.168.48.30::inst0::INSTR','ASRL10::INSTR','GPIB0::5::INSTR','GPIB0::20::INSTR')
>>>maturo=rm.open_资源('GPIB0::20::INSTR')
>>>esu=rm.open_资源('GPIB0::20::INSTR')
>>>esu.query(“*IDN?”)
'Rohde&Schwarz,ESU-40100348/040,4.73\n'
>>>esu.write(“mmem:del'traceData.DAT\”)
(26, )
>>>写(“mmem:cdir'D:\”)
(16, )
>>>esu.write(“hcop:dev:lang-DAT”)
(19, )
>>>esu.write(“hcop:dest'mmem\”)
(18, )
>>>esu.write(“mmem:stor:trac 1,\'traceData.DAT\'”)
(34, )
>>>写入(“mmem:data?\'traceData.DAT\”)
(28, )
>>>伊苏读
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
伊苏读
文件“C:\Users\hanson.li\AppData\Local\Programs\Python 35-32\lib\site packages\pyvisa\resources\messagebase.py”,第332行,已读
message=self.read_raw().decode(enco)
UnicodeDecodeError:“ascii”编解码器无法解码位置241处的字节0xe6:序号不在范围内(128)

读取时需要指定编码。采用
编码
参数:

ng = self.receiver_visa.read(encoding='latin1')
您需要找出仪器使用的编码,或者使用读取二进制数据


注意,使用错误的编解码器可能会导致错误;尤其是拉丁语-1,它总是乐于解码任何二进制数据,但结果文本可能不清晰。

阅读时需要指定编码。采用
编码
参数:

ng = self.receiver_visa.read(encoding='latin1')
您需要找出仪器使用的编码,或者使用读取二进制数据


注意,使用错误的编解码器可能会导致错误;特别是Latin-1,它总是乐于解码任何二进制数据,但结果文本可能不清晰。

您需要包含该异常的完整回溯,以便我们能够正确评估导致该异常的原因。不,源代码编码不是原因。这只会影响字符串文字的解码方式,而不会影响从其他地方读取的数据。@MartijnPieters感谢您的回复。我现在开始追踪。但我不认为这在很大程度上是有帮助的……相反,我发现它很有帮助。我看到
.read()
方法有一个
编码
参数。您知道返回的是什么类型的数据吗?您可以使用
esu.read(encoding='latin1')
,这会使错误消失,但可能会导致错误。@MartijnPieters哦,哇,这真是太棒了。谢谢。你介意把它作为一个答案,这样我就可以把它设置为一个可接受的答案吗?你需要包括该异常的完整回溯,这样我们才能正确地评估是什么导致了这一点。不,源代码编码不会是原因。这只会影响字符串文字的解码方式,而不会影响从其他地方读取的数据。@MartijnPieters感谢您的回复。我现在开始追踪。但我不认为这在很大程度上是有帮助的……相反,我发现它很有帮助。我看到
.read()
方法有一个
编码
参数。您知道返回的是什么类型的数据吗?您可以使用
esu.read(encoding='latin1')
,这会使错误消失,但可能会导致错误。@MartijnPieters哦,哇,这真是太棒了。谢谢。你介意把它作为一个答案呈现给我,这样我就可以把它设置为可接受的答案了吗?