UnicodeDecodeError ao executar os.walk

Estou recebendo o erro:

'ascii' codec can't decode byte 0x8b in position 14: ordinal not in range(128)

ao tentar fazer o os.walk. O erro ocorre porque alguns dos arquivos em um diretório têm o caractere 0x8b (não-utf8). Os arquivos vêm de um sistema Windows (daí os nomes de arquivos utf-16), mas copiei os arquivos para um sistema Linux e estou usando o python 2.7 (executando no Linux) para percorrer os diretórios.

Eu tentei passar um caminho inicial unicode para os.walk, e todos os arquivos e diretórios gerados são nomes unicode até chegar a um nome não utf8 e, por algum motivo, ele não converte esses nomes em unicode e então o código engasga com os nomes utf-16. Existe alguma maneira de resolver o problema antes de encontrar e alterar manualmente todos os nomes ofensivos?

Se não houver uma solução no python2.7, um script pode ser escrito em python3 para percorrer a árvore de arquivos e corrigir os nomes de arquivos incorretos, convertendo-os em utf-8 (removendo os caracteres não utf8)? N.B. existem muitos caracteres não utf8 nos nomes além de 0x8b, portanto, ele precisaria funcionar de maneira geral.

ATUALIZAÇÃO: O fato de 0x8b ainda ser apenas um caractere btye (apenas ascii não válido) o torna ainda mais intrigante. Eu verifiquei que há um problema ao converter essa string em unicode, mas que uma versão unicode pode ser criada diretamente. A saber:

>>> test = 'a string \x8b with non-ascii'
>>> test
'a string \x8b with non-ascii'
>>> unicode(test)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0x8b in position 9: ordinal not in  range(128)
>>> 
>>> test2 = u'a string \x8b with non-ascii'
>>> test2
u'a string \x8b with non-ascii'

Aqui está um rastreio do erro que estou recebendo:

80.         for root, dirs, files in os.walk(unicode(startpath)):
File "/usr/lib/python2.7/os.py" in walk
294.             for x in walk(new_path, topdown, onerror, followlinks):
File "/usr/lib/python2.7/os.py" in walk
294.             for x in walk(new_path, topdown, onerror, followlinks):
File "/usr/lib/python2.7/os.py" in walk
284.         if isdir(join(top, name)):
File "/usr/lib/python2.7/posixpath.py" in join
71.             path += '/' + b

Exception Type: UnicodeDecodeError at /admin/casebuilder/company/883/
Exception Value: 'ascii' codec can't decode byte 0x8b in position 14: ordinal not in range(128)

A raiz do problema ocorre na lista de arquivos retornados do listdir (na linha 276 do os.walk):

names = listdir(top)

Os nomes com caracteres> 128 são retornados como cadeias não unicode.

questionAnswers(6)

yourAnswerToTheQuestion