sábado, 22 de março de 2008

Codificação em nome de arquivo: mostrando o Python

Já que estou me quebrando com as músicas, deixe-me apresentar uma solução praquelas que o Exaile (meu player) não consegue ler por causa da codificação.

Como antes eu tinha tudo no Windows, quando copiei-as pro Linux, não percebi que a codificação do nome dos arquivos ficou em ISO8859-1. Como o Linux (e o Python - o Exaile é escrito em Python) usam UTF-8 como padrão, todas as que estão com acentos não são lidas...

A solução é um script Python (quem causou o problema que o resolva!). Ele pega todos os arquivos, checa se é UTF-8 e, se não for, decodifica e codifica de novo. Aqui está:
import os

def decode_all_in_dir(dir, from_cod='iso8859-1', to_cod='utf8'):
for arq in os.listdir(dir):
path = os.path.join(dir, arq);
if (os.path.isdir(path)):
decode_all_in_dir(path)
try:
arq.decode(to_cod)
except:
new_name = arq.decode(from_cod).encode(to_cod)
os.rename(os.path.join(dir, arq), os.path.join(dir, new_name))
print new_name

if __name__ == '__main__':
decode_all_in_dir('.')
Renomeou todos os arquivos, listando os que ele renomeou. Se rodar de novo, nenhum deve ser listado. Pronto, codificações corrigidas!

Um comentário:

Emerson disse...

Sensacional! Obrigado por compartilhar o script. Acho que depois dessa eu até vou aprender Python. :-)