2017-10-15 5 views
-1
def reademail(): 
f = open("Y11email.csv", "r") 
line= "email"+ ","+"fname"+","+"sname"+"password"+"\n" 
for line in f: 
    email,fname,sname,password=line.split(", ")#splits each line however creates an extra space between the lines because of enter 
    password=password.strip()#strip removes the extra space between the lines 
    print(email,fname,sname,password) 
f.close() 

Je suis nouveau sur python, donc je ne comprends pas l'erreur que je continue d'obtenir. J'espère que quelqu'un peut expliquer. Si vous avez besoin de plus d'informations que je vais modifier danspas assez de valeurs pour décompresser (attendu 4, j'ai eu 1) dans une fonction, python

email,fname,sname,password=line.split(", ")#splits each line however creates an extra space between the lines because of enter

ValueError: not enough values to unpack (expected 4, got 1)

Je veux imprimer comme ceci:.

[email protected] Name Surname fakepassword

[email protected] Z Y fakepassword

[email protected] Ray Check hello

Edit: J'ai essayé de supprimer l'espace entre après la virgule et essayé à .split ("\ n") mais a obtenu

email,fname,sname,password=line.split("\n")#splits each line however creates an extra space between the lines because of enter

ValueError: not enough values to unpack (expected 4, got 2)

au moins, j'obtenu une plus grande valeur XD

+1

parce que votre ligne de fichier n'a pas de virgules, btw vous devriez utiliser le 'csv' module pour lire les fichiers csv –

+0

Ou il ya des virgules ... juste pas de virgules avec un espace après eux ... :) –

+0

ouais. csv module _forever_ –

Répondre

0

plutôt que de réimplémenter ac sv lecteur, utilisez le csv module de la bibliothèque standard de Python.

Exemple copié à partir de la documentation:

>>> import csv 
>>> with open('eggs.csv', newline='') as csvfile: 
...  spamreader = csv.reader(csvfile, delimiter=' ', quotechar='|') 
...  for row in spamreader: 
...   print(', '.join(row)) 
Spam, Spam, Spam, Spam, Spam, Baked Beans 
Spam, Lovely Spam, Wonderful Spam 

Cela montre la manière canonique de lire un fichier CSV. Notez que le csv.reader donne une liste de chaînes pour chaque itération, vous n'avez donc pas à le diviser.

Vous pouvez tester la longueur de la ligne avant le diviser:

for row in Y11reader: 
    ll = len(row) 
    if ll != 4: 
     logging.warning('invalid row of {} items'.format(ll)) 
     continue # skip to next iteration. 
    email, fname, sname, password = row 
+0

la variable logging.warning() apparaît comme une erreur, je me demandais si vous saviez pourquoi? – Ray

+0

@ray Vous devez importer le module ['logging'] (https://docs.python.org/3.6/howto/logging.html) pour l'utiliser. –

0

Le problème est votre entrée. Vous devez vous assurer que chaque ligne de votre entrée a toutes ces 4 caractéristiques, et elles sont toujours délimitées par une virgule.

Cette erreur se produit lorsque le nombre de valeurs du côté droit de l'équation ne correspond pas au nombre de variables du côté droit. Un exemple serait:

Les œuvres suivantes de la ligne est divisée en une liste de 4 éléments

line = "1,2,3,4" 
line_list = line.split(',') #Looks like [1,2,3,4] 
first, second, third, fourth = line.split(',') #Each element is assigned to each variable 

Mais ce qui suit ne fonctionne pas

line = "1,2,3" 
line_list = line.split(',') #Looks like [1,2,3] 
first, second, third, fourth = line.split(',') 

Il n'y a personne pour le mappage univoque des éléments aux variables. Par conséquent, l'interprète va lancer une erreur en disant not enough values to unpack (expected 4, got 3). Comme 4 valeurs étaient attendues dans la liste (car il y a 4 variables sur le côté gauche de l'équation, mais seulement 3 ont été fournies.)

+0

J'ai essayé de corriger l'entrée mais maintenant mon programme dit qu'il y a plus d'éléments à déballer que prévu, pourriez-vous nous expliquer pourquoi? – Ray

+0

Pouvez-vous partager des exemples d'entrées? –