2014-07-10 1 views
0

J'ai un fichier texte avec plusieurs colonnes séparées par des tabulations d'informations sur les articles d'un blog. Chaque ligne du fichier représente un seul article, et en divisant une ligne autour des onglets, vous pouvez extraire un numéro d'identification, un titre, un paragraphe et d'autres choses sur cet article particulier.Pourquoi j'obtiens une erreur 'list index out of range' ici lors de la création d'une instance d'une classe?

Par exemple:

id articleID title paragraph 
1 4 Motorola prototypes from Frog Some cool looking concepts for phones... 

Donc, j'ai écrit un morceau de code qui se présente dans une liste appelée articlesFileList où chaque ligne est un élément dans la liste, et cela fonctionne exactement comme vous J'attends.

file = open("articles.txt", "r", encoding="utf-8") 
file.readline() # (Skip first line) 
articlesFile = file.read() 
articlesFileList = articlesFile.split("\n") 

Après cela, je puis diviser les lignes dans leurs colonnes individuelles et de créer article instances qui ont des attributs pour l'id, titre, etc. paragraphe

for line in articlesFileList: columns = line.split("\t") article = Article(columns[0], columns[2], columns[3]) articleList = [] articleList.append(article)

Mais ce code, puis jette cette erreur:

Traceback (most recent call last): 
File "E:\Python\RBTrends\RBTrendsAnalysis.py", line 55, in <module> 
articlesList = createArticles(articlesFileList) 
File "E:\Python\RBTrends\RBTrendsAnalysis.py", line 32, in createArticles 
article = Article(columns[0], columns[2], columns[3]) 
IndexError: list index out of range 

Ma première pensée était que peut-être le colonnes liste ne contenaient pas les informations correctes, donc j'ajouté le code suivant pour vérifier ce qui était dans cette liste:

for i in columns: 
    print(i) 

... et la liste apparaît absolument parfait. Chaque colonne de chaque ligne est imprimée correctement. J'ai même essayé d'imprimer chaque index de la liste juste pour voir si on pouvait y accéder "à la main", et ils le peuvent. Le programme avec accès aux éléments de la liste semble être juste lors de la création d'instances d'une classe.

Toute aide/explication serait très appréciée car c'est une erreur qui me déroute depuis un moment maintenant.

+2

Au lieu de faire cela à partir de zéro, je recommande d'utiliser le module csvreader. – justinfay

+0

Ce que vous avez collé contient une séparation d'espace, pas des onglets. Cela peut être une erreur de collage ... Mais cela causerait aussi l'erreur exacte que vous décrivez. – geoffspear

+0

@Wooble Oui, je devrais avoir déclaré dans le post .. Le vrai fichier a la séparation des onglets, mais ici, je viens d'écrire à la main les deux premières lignes du fichier avec 4 espaces au lieu des onglets parce que je ne pouvais pas taper dans la zone de texte. – xander

Répondre

0

La liste columns ne contient pas suffisamment d'éléments et ne parvient pas à récupérer l'élément inexistant.

Je peux imaginer deux raisons:

  • votre fichier contient la ligne vide, il peut être la dernière après finale « \ n ».
  • les lignes ne sont pas séparées par des tabulations, mais par des espaces.

Pour tester cela, je voudrais ajouter avant la ligne où il ne

assert len(columns) >= 4 

Comme vous utilisez l'index 3, vous devez avoir la liste avec 4 articles. Cette ligne va lancer une exception au cas où, la liste est plus courte.

Questions connexes