2010-01-19 5 views
0

Je viens de télécharger ce fichier CSV via un formulaire, en l'envoyant à mon script Python CGI. Le téléchargement semble s'être terminé avec succès. Autorisations sur le dossier sont 777, sur le fichier sont 755.TypeError en ouvrant simplement un fichier avec csv.DictReader?

>>> import csv 
>>> csvHandle = open('files/TestData.csv', "rb") 
>>> csvRawRecordDicts = csv.DictReader(csvHandle) 

Traceback (most recent call last): 
    File "<stdin>", line 1, in ? 
TypeError: __init__() takes at least 3 arguments (2 given) 

Les valeurs sont les suivantes:

csvRawRecordDicts undefined, 
csv = <module 'csv' from '/usr/lib/python2.3/csv.pyc'>, 
csv.DictReader = <class csv.DictReader>, 
csvHandle = <open file 'files/TestData.csv', mode 'rb'> 

Le code fonctionne très bien sur mon ordinateur local avec Python 2.5. L'erreur se produit sur 2.3.

Quel est le processus de réflexion pour déboguer quelque chose comme ça? Où est-ce que je commence à chercher?

+0

Les fichiers CSV sont du texte en-dessous; vous devriez utiliser un mode de "r". –

+1

@Ignacio: ** UTTERLY WRONG ** Docs pour csv.reader et csv.writer (Python 2.3 à 2.6) dit "" "Si csvfile est un objet fichier, il doit être ouvert avec le drapeau 'b' sur les plates-formes où fait une différence. "" ". Il serait mieux exprimé par "" "Si csvfile est un objet fichier, il doit avoir été ouvert avec le drapeau 'b' sur les plateformes où cela fait une différence.Pour la portabilité, ouvrez avec 'b' inconditionnellement" "". De plus, l'OP est sur une plate-forme * x, où le drapeau 'b' est ignoré. –

+0

@John: Ça va. –

Répondre

1

Il y a un certain nombre de choses que vous pourriez faire:

  • lire le relevant docs et voir que DictReader nécessite deux arguments au moins, alors que vous passez un
  • essayer de faire >>> help(csv.DictReader) et arriver à la même conclusion.

Comme la lecture des documents pourrait expliquer deuxième des arguments devraient être fieldnames (je suppose que la liste suffit), surtout cette information a été transmise dans le message d'erreur!

+1

Je vois, j'avais initialement développé le code sur Python 2.5 après avoir lu http://docs.python.org/library/csv.html#csv.DictReader qui a dit que 'fieldnames' est facultatif. Je vois que ce n'est pas optionnel en 2.3! Merci aussi pour l'aide(). – Pranab

1

Tout ce que dit fantôme silencieux, plus:

Un changement d'importance: À mon avis, le point le plus important est de lire attentivement le message d'erreur. Dans ce cas, il vous dit simplement et simplement que vous devez fournir un autre argument. Vérification de l'aide (ou les documents pour la version de Python que vous exécutez) suit ...

Un autre point: assurez-vous que vous comprenez ce que fait votre code. csv.DictReader() n'ouvre PAS un fichier. Les autorisations du système de fichiers ne sont pas pertinentes - vous avez déjà ouvert le fichier et transmis le handle à csv.DictReader().

+0

Je m'apprends Python, et je n'ai pas réalisé immédiatement où (ou pourquoi) aucune sorte de __init __() est venue dans le tout .. Je m'attendrais à ce que je dise clairement que csv.DictReader() nécessite trois arguments. Encore plus de confusion car ça a bien marché sur 2.5, sur mon ordinateur local - avec tous les autres problèmes que j'ai, je commence à croire qu'il est plus simple de porter un script de PHP5 vers PHP4 que de Python 2.5 vers 2.3 ... – Pranab

Questions connexes