• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Battousai

[Python] Normalizar nomes de ficheiros e pastas

12 mensagens neste tópico

Bem, estou a iniciar-me em python, estou mesmo muito verdinho.

Resolvi fazer uma função que permite normalizar nomes de ficheiros e pastas, substituindo os caracteres especiais e desnecessários, para uso na net, ou quem sabe mesmo no vosso pc.

Agradecia sugestões, comentários e críticas para melhorar, visto que Python é bastante diferente de todas as outras linguagens em que mexi até agora. Obrigado.

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# @ author:  Mauro Pinto

from os.path import splitext
from re import sub

def Sanitize(badString, filetype = False):

   if type( badString ) != type(""): return False

   bad = ['Š','Ž','š','ž','Ÿ','À','Á','Â','Ã','Ä','Å','Ç',
          'È','É','Ê','Ë','Ì','Í','Î','Ï','Ñ','Ò','Ó','Ô',
          'Õ','Ö','Ø','Ù','Ú','Û','Ü','Ý','à','á','â','ã',
          'ä','å','ç','è','é','ê','ë','ì','í','î','ï','ñ',
          'ò','ó','ô','õ','ö','ø','ù','ú','û','ü','ý','ÿ',
          'Þ','þ','Ð','ð','ß','Œ','œ','Æ','æ','µ','”',"'",
          '“','”',"\n","\r",'_']
   good = ['S','Z','s','z','Y','A','A','A','A','A','A','C',
           'E','E','E','E','I','I','I','I','N','O','O','O',
           'O','O','O','U','U','U','U','Y','a','a','a','a',
           'a','a','c','e','e','e','e','i','i','i','i','n',
           'o','o','o','o','o','o','u','u','u','u','y','y',
           'TH','th','DH','dh','ss','OE','oe','AE','ae','u',
           '','','','','','','-']

   for x in range( 0, len( bad ) ): badString = badString.replace( bad[x], good[x] )

   badString = [sub("[^A-Za-z0-9\-]", "", sub("\s+", "-", s ) ) for s in splitext( badString.strip() )]

   return (badString[0] + (filetype and "." or "") + badString[1]).lower()

if __name__ == "__main__":

   print Sanitize("çççÇÇÇÇÇççççàÀëóíé~^;;;,qweqweW..", False)
   print Sanitize("asd.asd.asd.asd.asd.cmd", True)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Esse loop foi bem pensado. :thumbsup:

Mas se tivesses no bad letras que já tenhas no good, isso pode dar buraco. Eu faria antes:

def rep(x):
global bad, good
for i in range(0, len(bad)):
  if bad[i] is x: return good[i]
return x

map(rep, badString)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

hum, chegas-te a testar isso? aqui dá bronca, supondo que estejas a falar disto:

def rep(x):
    global bad, good
    for i in range(0, len(bad)):
        if bad[i] is x: return good[i]
    return x

def Sanitize(badString, filetype = False):

    if type(badString) != type(""): return False
    
    global bad,good
    
    #list = zip( bad, good )
    
    nova = str( map(rep,badString) )
    
    #for couple in list:
    #    badString = badString.replace(couple[0], couple[1])
    
    split = map(lambda txt:re.sub("[^A-Za-z0-9\-]", "", re.sub("\s+", "-", txt ) ),[s for s in os.path.splitext( nova.strip() )])

    return (split[0] + (filetype and "." or "") + split[1]).lower()

bad = ['Š','Ž','š','ž','Ÿ','À','Á','Â','Ã','Ä','Å','Ç',
       'È','É','Ê','Ë','Ì','Í','Î','Ï','Ñ','Ò','Ó','Ô',
       'Õ','Ö','Ø','Ù','Ú','Û','Ü','Ý','à','á','â','ã',
       'ä','å','ç','è','é','ê','ë','ì','í','î','ï','ñ',
       'ò','ó','ô','õ','ö','ø','ù','ú','û','ü','ý','ÿ',
       'Þ','þ','Ð','ð','ß','Œ','œ','Æ','æ','µ','”',"'",
       '“','”',"\n","\r",'_']
good = ['S','Z','s','z','Y','A','A','A','A','A','A','C',
        'E','E','E','E','I','I','I','I','N','O','O','O',
        'O','O','O','U','U','U','U','Y','a','a','a','a',
        'a','a','c','e','e','e','e','i','i','i','i','n',
        'o','o','o','o','o','o','u','u','u','u','y','y',
        'TH','th','DH','dh','ss','OE','oe','AE','ae','u',
        '','','','','','','-']

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não é str(map()), é ''.join(map()), sorry 'bout that.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

opa deixa la isso, também quem é que vai alterar os caracteres e metê-los repetidos?

só doidos! :thumbsup:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

opa deixa la isso, também quem é que vai alterar os caracteres e metê-los repetidos?

só doidos! :D

                ||

                ||

                \/

mania de preguiçoso :P xD

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Vocês estão a percorrer o array a ver qual a posição no bad que ele ocupa?

Se sim, usar uma estrutura de dados tipo um map/hash devia ser bem mais eficiente...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se sim, usar uma estrutura de dados tipo um map/hash devia ser bem mais eficiente...

Sim, tens razão. Até estava capaz de aprender mais algumas coisas de Python e criar um tipo para isso, mas estou com preguiça. :P
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O Python não tem nada disso?

Acho que já ouvi falar em dicionários em Python (ou se calhar foi só em Perl). Não sei que estrutura de dados têm por traz (neste caso, o ideal devia ser uma tabela de hash), mas já devia servir.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tem, o dict, e sim, é uma tabela de hashes. Mas considero o conceito do dict muito pouco explorado, pelo que preferia re-implementá-lo.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Vocês estão a percorrer o array a ver qual a posição no bad que ele ocupa?

Se sim, usar uma estrutura de dados tipo um map/hash devia ser bem mais eficiente...

A minha implementação inicial era bem mais eficiente que esta, mas editei porque ainda não sabia bem quais as estruturas mais eficientes em python e pensei que esta seria a melhor. Estava enganado... :-[
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora