2010-12-15 141 views
0

J'essaie d'ouvrir un fichier txt et le lire, mais je reçois une erreur de type et je ne sais pas pourquoi. Si vous pouvez nous fournir un raisonnement avec la syntaxe correcte, j'essaie de mieux comprendre ce qui se passe en dessous. Voici le code, il est assez simple, je pense:Python Type Erreur (probablement simple)

from sys import argv 

script = argv 
filename = argv 

txt = open(filename) 

print "Here's your file %r" %filename 
print txt.read() 

Muchas Gracias

Répondre

4

argv est une liste, pas une chaîne. Vous voulez

script = argv[0] 
filename = argv[1] 

Tenir compte à l'aide argparse au lieu de remettre sys.argv directement:

>>> import argparse 
>>> parser = argparse.ArgumentParser(description="Print a file.") 
>>> parser.add_argument("path", type=str, nargs=1, help="Path to the file to be printed.") 
_StoreAction(option_strings=[], dest='path', nargs=1, const=None, default=None, type=<type 'str'>, choices=None, help='Path to the file to be printed.', metavar=None) 
>>> args = parser.parse_args() 
>>> print args 
Namespace(path=[<...>]) 

Il semble beaucoup plus compliqué, mais il fera de votre utilitaire de ligne de commande beaucoup plus flexible, plus facile à développer, et vous assurera que vous obtenez la documentation appropriée sur la ligne de commande.

2

Tout d'abord, argv est une liste d'arguments. Ouvrir ne prend pas de liste. C'est pourquoi vous obtenez une erreur de type.

En second lieu, ouvert (doit) prendre 2 paramètres, le nom du fichier et le mode (oui mode est en option, mais prenez l'habitude de le mettre là-bas. Remplacez-le par

import sys 

script = sys.argv[0] 
filename = sys.argv[1] 

txt = open(filename, 'r') 

print "Here's your file %r" %filename 
print txt.read() 
+0

Pourquoi prendre l'habitude de mettre un mode? le point d'un argument par défaut est que ce n'est pas toujours nécessaire. – katrielalex

+0

Parce que je devais regarder si le mode était optionnel, et quel est le défaut La valeur est. Cela signifie que toute personne lisant ce code pourrait faire de même. Ce qui est mauvais. – Falmarri

+0

Ajoutez également un indicateur binaire ou en mode texte. Cela fait une différence sur Windows. Et en Python cela * fait * toujours une différence, alors mettez-le dedans. –

0

argv sera une liste, tandis que le nom de fichier doit être une chaîne.

Vous devriez probablement utiliser filename = argv[1]