2014-09-24 60 views
2

我遇到一个奇怪的问题,返回相同的错误,无论我使用的编码。代码运行良好,没有Python 2.7.8中的编码部分,但它在2.7.6中破解,这是我用于我所有开发的版本。字符串与Unicode编码 - Struct()参数

import MIDI_PY2 as md 
import glob 
import ast 
import os 
dir = '/Users/user/Desktop/sample midis/' 
os.chdir(dir) 
file_list = [] 

for file in glob.glob('*.mid'): 
    file_list.append((dir + file)) 

dir = '/Users/user/Desktop/sample midis/' 
os.chdir(dir) 

file_list中返回此:

[u'/Users/user/Desktop/sample midis/M1.mid', 
u'/Users/user/Desktop/sample midis/M2.mid', 
u'/Users/user/Desktop/sample midis/M3.mid', 
u'/Users/user/Desktop/sample midis/M4.mid'] 

md.concatenate_midis(file_list中, '/用户/ luissanchez /桌面/温度/ out.mid')返回此错误:

- 
TypeError         Traceback (most recent call last) 
<ipython-input-73-2d7eef92f566> in <module>() 
----> 1 md.concatenate_midis(file_list_1,'/Users/user/Desktop/temp/out.mid') 

/Users/user/Desktop/sample midis/MIDI_PY2.pyc in concatenate_midis(paths, outPath) 

/Users/user/Desktop/sample midis/MIDI_PY2.pyc in midi2score(midi) 

/Users/user/Desktop/sample midis/MIDI_PY2.pyc in midi2opus(midi) 

TypeError: Struct() argument 1 must be string, not unicode 

那么我修改代码,所以第一个参数是字符串,而不是unicode:

file_list_1 = [str(x) for x in file_list] 

返回:

['/Users/user/Desktop/sample midis/M1.mid', 
'/Users/user/Desktop/sample midis/M2.mid', 
'/Users/user/Desktop/sample midis/M3.mid', 
'/Users/user/Desktop/sample midis/M4.mid'] 

运行功能concatenate_midis利用这最后名单(file_list_1)正好返回相同的错误:类型错误:结构()参数1必须是字符串,不是Unicode。

有人知道这里发生了什么吗? concatenate_midi在Python 2.7.8中运行良好,但无法弄清楚它为什么不能在我使用的东西中工作,Enthought Canopy Python 2.7.6 | 64位

由于

+1

struct.pack被修复为接受Python 2.7.7中的unicode格式字符串。 请参阅:https://hg.python.org/cpython/raw-file/f89216059edf/Misc/NEWS 在问题的顶部,你说你在开发中使用2.7.7,但在底部你说2.7 0.6。我怀疑你实际使用2.7.6。 – phoenix 2015-05-19 14:07:20

回答

2

错误

error: TypeError: Struct() argument 1 must be string, not unicode.

通常由struct.unpack()功能,在旧版本的Python需要字符串参数,而不是统一造成的。检查struct.unpack()参数是字符串而不是unicode。

+0

谢谢。问题解决了。 – 2014-09-24 15:03:17

1

一个可能的原因是from __future__ .. statement

>>> type('a') 
<type 'str'> 
>>> from __future__ import unicode_literals 
>>> type('a') 
<type 'unicode'> 

检查您的代码是否包含该语句。