2014-09-24 59 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'> 

檢查您的代碼是否包含該語句。