2016-05-09 13 views
0

Ich wollte in einer Datei lesen, die 4 Werte auf jeder Zeile hat: Titel, Autor, Genre, Preis.Split jedes Wort in der Zeile durch Komma, dann ganze Zeile in der Liste speichern

Ich möchte jeden Wert, der ein ',' als Trennzeichen hat, aufteilen. Dann möchte ich es in meiner Liste speichern, wobei jede Zeile ein Eintrag in der Liste ist. Zum Beispiel

title, author, genre, price 

title2, author2, genre2, price2 

Das spart als

List[0][1] = title 
List[0][2] = author 
List[0][3] = genre 
List[0][4] = price 

List[1][1] = title2 
List[1][2] = author2 
List[1][3] = genre2 
List[1][4] = price2 

Dies ist, was habe ich bisher:

def readFile(fileName): 
List = [] 
f = open(fileName, 'r') 
line = f.readline() 
x = 0 
while len(line) != 0: 
    for i in range(4): 
     List[x][i] = line.split(',') 
    x += 1 
    line = f.readline() 
f.close() 
return List 

Aber ich bin nur List index out of range bekommen.

+1

Mögliches Duplikat [Python las in Zeichenfolge aus der Datei und spaltete es in Werte] (http: // Stackoverflow.com/questions/9857731/python-eingelesen-string-from-file-and-split-es-in-values) – AKS

Antwort

2

Python hat man hier behandelt, benutzen Sie einfach die csv module:

import csv 

def readFile(filename): 
    with open(filename, 'rb') as f: 
     reader = csv.reader(f) 
     return list(reader) 

Ihr Code mehrere klassische Fehler macht:

  • str.split() gibt eine Liste; Sie versuchen, diese Liste vier Mal den Indizes einer anderen Liste zuzuordnen. Verwenden Sie einfach die von zurückgegebene Liste direkt.
  • Berücksichtigen Sie, dass Zeilen aus einer Datei mit dem Zeilentrennzeichen (\n) enthalten sind; Sie wollen das wahrscheinlich zuerst ablegen.
  • Sie haben mit einer leeren Liste begonnen. Sie können keine Indizes zuweisen, die nicht vorhanden sind. Verwenden Sie stattdessen list.append(), um Elemente hinzuzufügen.
  • Sie müssen nicht für len(line) != 0 testen; nur if line: ist genug, weil leere Strings in einem Wahrheitstest als "falsch" betrachtet werden. Siehe Truth Value Testing.
  • Sie müssen nicht jedes Mal file.readline() verwenden; Verwenden Sie einfach eine for line in f:-Schleife und Sie erhalten jede Zeile nacheinander, da Dateiobjekte iterable sind.
  • Wenn Sie Ihre file as a context manager (mit der with-Anweisung) verwenden, schließt Python die Datei für Sie.

also ohne csv Modul, können Sie Ihren Code wie folgt schreiben:

def readFile(fileName): 
    rows = [] 
    with open(fileName, 'r') as f: 
     for line in f: 
      columns = line.strip().split(',') 
      rows.append(columns) 
    return rows 
+0

Entschuldigung, ich bin nicht berechtigt, Module zu verwenden - ich hätte das angegeben. Es ist für Klassenarbeiten. – Ryan

+0

@Ryan: Ich schrieb bereits alles auf, was in Ihrem Code korrigiert werden musste. –

+0

Danke - Das ist so viel sauberer und effizienter als das, was ich gemacht habe. Die Erklärungen haben auch sehr geholfen! – Ryan

-1
with open(filname,'r') as f: 
     lst_data = f.readlines() 

    List = [] 
    for data in lst_data: 
     List.append(data.strip().split(',')) 

Liste haben die Daten wie diese

List[0][1] = title 
List[0][2] = author 
List[0][3] = genre 
List[0][4] = price 

List[1][1] = title2 
List[1][2] = author2 
List[1][3] = genre2 
List[1][4] = price2 
0

ich glaube, Sie verwenden können die Python List Comprehensions, um Ihre Funktion mit weniger Code zu erreichen.

def readFile(fileName): 
    with open(fileName, 'r') as f: 
     List = [line.strip().split(',') for line in f if line.strip()] 
    return List 

Das obige Programm entspricht das folgende Programm:

def readFile2(fileName): 
    with open(fileName, 'r') as f: 
     List = [] 
     for line in f: 
      if line.strip(): 
       List.append(line.strip().split(',')) 
    return List 
Verwandte Themen