我试着运行这个:
def ReadWord(fid,fmt,Addr):
fid.seek(Addr)
s = fid.readline(2)
s = unpack(fmt + 'h', s)
if(type(s) == tuple):
return s[0]
else:
return s
有:
^{pr2}$但是,Python返回:
struct.error: unpack requires a string argument of length 4
根据python struct.unpack
documentation:
The string must contain exactly the amount of data required by the format (len(string) must equal calcsize(fmt)).
因此,如果字符串的长度是2,fmt+'h'
的calcsize也是2,那么为什么python会说“unpack需要一个字符串参数length4”??在
编辑:
谢谢你的回答。以下是完整代码:
http://qtwork.tudelft.nl/gitdata/users/guen/qtlabanalysis/analysis_modules/general/lecroy.py
因此,正如您在read_timetrace
函数中看到的,在if...else
语句中,fmt
被设置为'<'
或{
但是你也应该知道我在windowsx64上工作(为了工作)。在
编辑2
这是完整的回溯,抱歉弄错了。在
Traceback (most recent call last):
File "C:\Users\maxime.vast\Desktop\Test Campaign Template\Test Suite\Include\readLecroyTRCFile.py", line 139, in <module>
read_timetrace("C:\Users\maxime.vast\Desktop\Test Campaign Template\Test Suite\Traces\KL.ES.001.001.trc")
File "C:\Users\maxime.vast\Desktop\Test Campaign Template\Test Suite\Include\readLecroyTRCFile.py", line 60, in read_timetrace
WAVE_ARRAY_1 = ReadLong(fid, fmt, aWAVE_ARRAY_1)
File "C:\Users\maxime.vast\Desktop\Test Campaign Template\Test Suite\Include\readLecroyTRCFile.py", line 100, in ReadLong
s = unpack(fmt + 'l', s)
struct.error: unpack requires a string argument of length 4
[Finished in 0.2s]
编辑3:
我将readline
替换为read
,并添加:
print "len(s) ", len(s)
print "len(fmt) ", len(fmt)
print "calcsize(fmt) ", calcsize(fmt)
print "calcsize(fmt + 'h') ", calcsize(fmt + 'h')
print "fmt ", fmt
到ReadLong
函数。在
这是新的回溯:
len(s) 4
len(fmt) 1
calcsize(fmt) 0
calcsize(fmt + 'h') 2
fmt <
len(s) 4
len(fmt) 1
calcsize(fmt) 0
calcsize(fmt + 'h') 2
fmt <
len(s) 4
len(fmt) 1
calcsize(fmt) 0
calcsize(fmt + 'h') 2
fmt <
len(s) 1
len(fmt) 1
calcsize(fmt) 0
calcsize(fmt + 'h') 2
fmt <
Traceback (most recent call last):
File "C:\Users\maxime.vast\Desktop\Test Campaign Template\Test Suite\Include\readLecroyTRCFile.py", line 143, in <module>
read_timetrace("C:\Users\maxime.vast\Desktop\Test Campaign Template\Test Suite\Traces\KL.ES.001.001.trc")
File "C:\Users\maxime.vast\Desktop\Test Campaign Template\Test Suite\Include\readLecroyTRCFile.py", line 60, in read_timetrace
WAVE_ARRAY_1 = ReadLong(fid, fmt, aWAVE_ARRAY_1)
File "C:\Users\maxime.vast\Desktop\Test Campaign Template\Test Suite\Include\readLecroyTRCFile.py", line 104, in ReadLong
s = unpack(fmt + 'l', s)
struct.error: unpack requires a string argument of length 4
[Finished in 0.2s]
当
len(fmt)
=1时,表示fmt
有值。如果fmt
='h',那么fmt+'h'
将是'hh'。因此,unpack()需要4个字节的数据,因为每个“h”都需要一个短整数(2个字节)。在FWIW,您应该使用}。如果
read(2)
,而不是{fmt
字符串真的是'>'
,那么就不会得到这个错误。下面是一个简短的演示,它的性能符合预期。在输出
^{pr2}$顺便说一句,
struct.unpack()
总是返回一个元组,即使返回值是单个项。在对二进制文件使用
readline(2)
可能会产生意外的结果。在上面代码的测试文件中,文件中有一个(Linux风格)换行符\xa0
。因此,如果您将s = fid.read(2)
更改为s = fid.readline(2)
,开始时一切正常,但是在第10行,它崩溃了,因为它只读取一个字节,这是由于新行字符:输出
后记
您的代码中有几个函数几乎执行相同的操作。这打破了DRY原则:不要重复你自己。这里有一种方法可以解决这个问题,使用部分函数应用程序。有关详细信息,请参阅functools docs。在
您需要使用关键字来调用这些新函数。例如
是的,这稍微有些冗长,但它使代码更具可读性。在
格式的长度本身并不重要。重要的是你在那里指定了什么样的格式。例如,有一些格式规范指定一个字节甚至八个字节。所以这实际上取决于
s
中应该有多少个字符。在例如:
如果},那么它应该可以正常工作:
^{pr2}$fmt
真的是{所以我假设当出现错误时,
fmt
是而不是只是>
,而是其他会消耗额外2个字节的东西。尝试在unpack
之前打印fmt
。在相关问题 更多 >
编程相关推荐