10
votes

Nom du fichier insensible à l'affaire Python?

J'ai besoin de charger un fichier donné son nom, mais le nom que je reçois est l'insensibilité de la casse. "A.TXT" pourrait réellement être "A.TXT". Comment faire cela le moyen rapide (non générer tous les noms possibles et essayer chacun)?


3 commentaires

Cela n'aurait pas d'importance, le nom que je reçois (ce qui est insensible à la casse) est analysé d'un fichier de script.


Le système d'exploitation (et même le système de fichiers) est certainement pertinent ici.


Désolé, ce que je voulais dire était 1) Je reçois le nom de fichier d'un script. 2) Et je veux que mon programme soit multiplate-forme. Donc, peu importe le système d'exploitation que j'utilise.


4 Réponses :


7
votes

Vous pouvez afficher le répertoire dans le fichier ( os.listdir ) et voir s'il y a des correspondances pour votre nom de fichier. La correspondance peut être faite par des noms de fichiers inférieurs et de la comparaison.


4 commentaires

Ouais, mais est-ce efficace? Considérant que le dossier peut avoir des milliers de fichiers?


@ user975135: Je ne m'inquiéterais pas de l'inefficacité avant d'avoir essayé cette approche et que c'est trop lent pour vos besoins.


Eh bien, j'ai traité des milliers de cordes à la fois avec Python avant donc je pense que je ne devrais pas l'ignorer s'il y a une autre façon.


@ user975135: Comme il s'agit de la lecture de disque, nous parlons, je suis sûr que les frais généraux de ce code Python seront petits, relatifs au temps passé par le système d'exploitation qui interrogeent le disque dur et faire la liste.



1
votes

Faire une liste de répertoires; et créer un dictionnaire contenant une cartographie des noms de fichiers majuscules à leurs noms de fichiers actuels. Ensuite, faites votre entrée majuscule et cherchez-la dans le dictionnaire.


0 commentaires

6
votes

Vous ne pouvez pas le faire sans prendre une liste de répertoires et prendre à la fois l'article que vous recherchez et chacun dans le répertoire à un cas commun de comparaison. Le système de fichiers est sensible à la casse et c'est tout ce qu'il y a.

Voici une fonction (bien, deux) que j'ai écrit pour le faire complètement, correspondant à un nom de fichier de manière insensible, de manière récursive: Htp://portableApps.hg.sourceforge.net/hgweb/portableApps/Development-Toolkit/file /775197d56e86/utils.py#l78 . xxx


0 commentaires

3
votes

Ceci est une simple fonction récursive à la recherche ELI suggère ci-dessus:

def find_sensitive_path(dir, insensitive_path):

    insensitive_path = insensitive_path.strip(os.path.sep)

    parts = insensitive_path.split(os.path.sep)
    next_name = parts[0]
    for name in os.listdir(dir):
        if next_name.lower() == name.lower():
            improved_path = os.path.join(dir, name)
            if len(parts) == 1:
                return improved_path
            else:
                return find_sensitive_path(improved_path, os.path.sep.join(parts[1:]))
    return None


0 commentaires