2013-06-28 5 views
0

J'utilise argparse et je veux quelque chose comme: test.py --file hello.csvPython: argparse lecture du fichier csv fonctionne

def parser(): 
    parser.add_argument("--file", type=FileType('r')) 
    options = parser.parse_args() 

    return options 

def csvParser(filename): 
    with open(filename, 'rb') as f: 
     csv.reader(f) 
     .... 
    .... 
    return par_file 

csvParser(options.filename) 

Je reçois une erreur: TypeError Unicode qui exerce la contrainte: Chaîne de besoin ou tampon, fichier trouvé.

Comment pourrais-je résoudre ce problème?

Répondre

4

Le type FileType()argparse renvoie un déjà ouvert fileobject.

Vous n'avez pas besoin de l'ouvrir à nouveau:

def csvParser(f): 
    with f: 
     csv.reader(f) 

De l'argparse documentation:

To ease the use of various types of files, the argparse module provides the factory FileType which takes the mode= , bufsize= , encoding= and errors= arguments of the open() function. For example, FileType('w') can be used to create a writable file:

>>> 
>>> parser = argparse.ArgumentParser() 
>>> parser.add_argument('bar', type=argparse.FileType('w')) 
>>> parser.parse_args(['out.txt']) 
Namespace(bar=<_io.TextIOWrapper name='out.txt' encoding='UTF-8'>) 

et de la documentation FileType() objects:

Arguments that have FileType objects as their type will open command-line arguments as files with the requested modes, buffer sizes, encodings and error handling (see the open() function for more details)

+0

Alors, comment pensez-vous Je serais en mesure de prendre cet objet de fichier déjà ouvert et l'analyser à travers une fonction que j'ai créée? Je vois, mais je le voudrais si un utilisateur serait en mesure de taper le nom de fichier dans l'invite de commande – TTT

+0

@TTT: Les objets de fichiers sont juste des objets. Passez le à la fonction. –

+0

@TTT: Votre utilisateur ** est ** capable de taper le nom du fichier. 'argparse' ouvre alors ce fichier pour vous et vous donne l'objet de fichier résultant. –