Jump to content

[Python] Normalizar nomes de ficheiros e pastas


Recommended Posts

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)
Link to comment
Share on other sites

Esse loop foi bem pensado. 👍

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)

Não peças ajuda por PM! A tua dúvida vai ter menos atenção do que se for postada na secção correcta do fórum!

Link to comment
Share on other 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',
        '','','','','','','-']
Link to comment
Share on other 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. 😛

Não peças ajuda por PM! A tua dúvida vai ter menos atenção do que se for postada na secção correcta do fórum!

Link to comment
Share on other 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.

Não peças ajuda por PM! A tua dúvida vai ter menos atenção do que se for postada na secção correcta do fórum!

Link to comment
Share on other 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... ?
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.