2017-01-29 5 views
0

Ich habe den folgenden Code, in dem die Kommentare die Ausgabe und die gewünschte Ausgabe erklären. Es scheint mir nicht möglich zu sein, auf die verschiedenen Felder in der Liste zuzugreifen (oder die Logik zu verstehen).Zugriff auf die erste Spalte in jeder Zeile in einer Liste Python

Bei der fraglichen Datei handelt es sich um eine Textdatei, die auf dem Benutzernamen des Benutzers basiert. Die Inhalte sind:

"['Sci-Fi', 'Blade Runner']" 
"['Sci-Fi', 'Star Trek']" 
"['Sci-Fi', 'Solaris']" 
"['Sci-Fi', 'Cosmos']" 
"['Drama', ' The English Patient']" 
"['Sci-Fi', 'Out of the Silent Planet']" 
"['Drama', ' The Pursuit of Happiness']" 
"['Drama', ' The English Patient']" 
"['Drama', ' Benhur']" 
"['Drama', ' Benhur']" 

Eine Antwort auf die Frage, wie die Spalte Feld zuzugreifen (z Sci-Fi, Drama usw.) und eine Erklärung wäre sehr geschätzt.

Ich möchte die gesamte erste Spalte drucken .... dh SCI-FI, SCI-FI, SCI-FI, DRAMA etc ..... Ich brauche diese in eine Liste gelesen werden, so dass sie sein können manipuliert innerhalb der Liste

Basierend auf einer der Antworten unten, wenn das Problem ist in Bezug auf die Art, wie die Daten in die Datei an erster Stelle geschrieben wurde, ist der Code/Funktion, die diese Daten in die Datei schreibt, unten :

def viewfilmfunction(x,username): 
    #open the file as student file (variable) 
    print(username, ":You are about to view Film:", x, "Enter the selection  ID number of the film again to confirm viewing") 
    with open("films.txt","r") as filmsfile: 
     #prompt the user to enter the ID number they require 
     idnumber=input("Enter the ID number you require:") 
     #call upon our reader (this allows us to work with our file) 
     filmsfileReader=csv.reader(filmsfile) 
     #for each row that is read by the Reader  
     for row in filmsfileReader: 
      #and for each field in that row (this does it automatically for us) 
      for field in row: 
       #if the field is equal to the id number that is being searched for 
       if field ==idnumber: 
        #print the row fields (genre and title) corresponding to that ID number 
        #create a list which contains the relevant fields in the row. 
        viewedlist=[row[1],row[2]] 
        print("You have viewed:", viewedlist) 
    with open("fakeflixfile.txt","r")as membersfile: 
     #Open Reader 
      membersfileReader=csv.reader(membersfile) 
      for row in membersfileReader:    
       for field in row: 
        if field==username: 

        #Open Writer to append to file -this time it looks for the file stored by that username 
        with open("%s.txt" % username,"a") as membersfile: 

         membersfileWriter=csv.writer(membersfile) 
         #Use the writer to append the viewedlist to the appropriate member's user file. 
         membersfileWriter.writerow([viewedlist]) 

FAKEFLIXFILE.txt Inhalt

username13022,[email protected],user,name1,2/02/3022,user Road,US455P,Mle,Nothing,[email protected] AugustineSalins1900.txt,[email protected],Augustine,Salins,5/02/1900,Hutchins Road,CRBBAAA,Male,Theology,[email protected] JosieBletchway3333,[email protected],Josie,Bletchway,29/02/3333,Bletch Park,BB44AA,Female,Encryption,[email protected] JoeBloggs.0.0,[email protected],Joe,Bloggs,0.0.0.0,0 Road,00000,Male,Joe Blogs,[email protected]

UPDATE: Ich habe jetzt die txt-Datei (basierend auf Benutzername) geändert, so dass der Ausgang erzeugt keine Liste erzeugen:

Drama, The English Patient 

Drama, Benhur 

Sci-Fi,Cosmos 

jedoch auf Lauf:

def viewrecs(username): 
    #pass 
    username = (username + ".txt") 
    with open(username,"r") as f: 
      fReader=csv.reader(f) 
      for row in fReader: 
      print(eval(row)[0]) 

Der Fehler weiterhin besteht:

print(eval(row)[0]) 
    TypeError: eval() arg 1 must be a string, bytes or code object 
+0

Wie funktioniert Ihr ‚fakeflxfile.txt‘ aussehen wie? Kannst du ein paar Zeilen einfügen? – Vlad

+0

eingefügt FAKEFLIXFILE.txt Inhalt in der Bearbeitung über –

+0

, weil Sie auf eine CSV-Datei zugreifen und auf bestimmte Spalten zugreifen möchten, könnten Sie versuchen, ein 'Dataframe' mit' Pandas' zu verwenden, wenn Pandas implementieren eine Option ist. Das wäre ziemlich einfach, wenn Sie all Ihre Inhalte einrahmen und auf Zeilen und Spalten zugreifen möchten. – arde

Antwort

1

Da Ihre Datei keine gültige CSV-Datei ist. Es sieht mehr wie eine Reihe von JSON-Objekten aus. Jede Zeile in Ihrer Datei ist in doppelte Anführungszeichen eingeschlossen. CSV-Reader behandelt es daher als eine einzelne Spalte. Deshalb erhalten Sie die Zeile [0]

Dies wird durch die Art und Weise verursacht, wie Sie Ihre Datei schreiben. Die Zeile weist unter Schreiber CSV ein Objekt zu schreiben, die eine Liste zwei Werte enthält

membersfileWriter.writerow([viewedlist])

, was Sie wirklich wollen, ist CSV Schriftsteller zu sagen, mehrere Objekte zu schreiben. Ändern Sie Ihre Linie dazu keine Notwendigkeit, es eckigen Klammern zu umschließen:

membersfileWriter.writerow(viewedlist)

Dann können Sie einfach so Ihre Datei zu lesen:

with open(username,"r") as f: fReader=csv.reader(f) for row in fReader: print (row) # print entire row print (row[0]) # print just the first field

+0

'json.loads()' würde nicht funktionieren; Die Zeilen sind kein gültiger JSON, da sie einfache Anführungszeichen anstelle von doppelten Anführungszeichen enthalten. –

+0

Ich möchte in der Lage sein, das Problem zu lösen, ohne JSON zu verwenden - einfach lesen und schreiben und direkte Dateiverwaltung .... –

Verwandte Themen