[Python] Récupérer type MIME d'un fichier CSV

Bonjour,

Je suis en train de développer un template en Python qui a besoin de vérifier si un fichier est bien de type CSV. Pour cela, j'ai écrit les lignes suivantes :

import mimestypes
ctype, encoding = mimetypes.guess_type('clients.csv')

Si je lance ce code avec un fichier Excel, par exemple, j'obtiens bien le type MIME correspond. Cependant, lorsque je teste avec, justement, un fichier CSV, j'obtiens l'erreur suivante : la fonction guess_type renvoie "None" comme valeur de ctype.

Est-ce que quelqu'un peut m'aider ?
Merci d'avance !
Configuration: Windows XP
Internet Explorer 7.0

6 réponses

  1. Modérateur
    None signifie qu'il n'a pas réussi à deviner le type MIME.

    Tu pourrais le forcer toi-même:

    import mimestypes
    nom = 'clients.csv'
    ctype, encoding = mimetypes.guess_type(nom)
    if (not ctype) and nom.lower().endswith('.csv'):
        ctype = "text/csv"
    


    Note que pour le CSV, les deux type MIME valides sont text/csv ou text/comma-separated-values (au choix).

    Reste l'encodage, que tu ne peux pas deviner. L'information sur l'encodage doit être transmise avec le fichier, sans quoi le fichier est inexploitable.
    0
    1. Merci pour ta réponse ! Cependant, je suis tout de même étonnée qu'il renvoie "None" alors que le type MIME CSV fait partie des types définis par l'IANA... :-/
      0
      1. Modérateur
        Oui le type MIME CSV est défini, mais il n'arrive pas à le déterminer.

        Un exemple: Le texte suivant est-il du CSV ?
        Salut, mon coco !


        Personne ne peut répondre à ça. Ni un programme, ni un humain.
        Tout dépend de ce que c'est censé être.
        0
        1. OK, donc si je comprends bien, dans le cas du CSV, la fonction
          mimetypes.guess_type(nom)
          ne pourra jamais déceler si c'en est ou non...
          0
          1. Modérateur
            Voilà... mon "Salut, mon coco !" peut très bien être du CVS, ou bien une simple phrase avec une virgule.
            0
            1. Merci pour toutes ces explications ! :-)
              0