2016-11-25 4 views
0

Ich versuche eine Liste zu teilen, die ich mit str() konvertiert habe, aber ich scheine keine Ergebnisse zu liefern?.split() gibt leere Ergebnisse zurück

Mein Code ist wie folgt:

import csv 

def csv_read(file_obj): 
    reader=csv.DictReader(file_obj,delimiter=',') 
    for line in reader: 
     unique_id.append(line["LUSERFLD4"]) 
     total_amt.append(line["LAMOUNT1"]) 
     luserfld10.append(line["LUSERFLD10"])  
     break 

    bal_fwd, junk, sdc, junk2, est_read=str(luserfld10).split(' ') 

if __name__=="__main__": 
    with open("UT_0004A493.csv") as f_obj: 
     csv_read(f_obj) 

print (luserfld10) 
print (bal_fwd) 
print (sdc) 
print (est_read) 

print (luserfld10) gibt [ 'N | N | Y '] das ist richtig. (Aufgrund von Systemeinschränkungen beim Erstellen der CSV-Datei enthält dieses Feld drei separate Werte.)
Alle Variablen wurden definiert und ich erhalte keine Fehler, aber meine letzten drei Druckbefehle geben leere Listen zurück?

Ich habe versucht, die .split() Zeile, aber dann kann ich nur einen Wert entpacken.

Wie bekomme ich sie zu jeder Rückkehr N oder Y?

Warum funktioniert es nicht so wie es ist?

Ich bin mir sicher, dass es offensichtlich ist, aber dies ist meine erste Woche des Codierens und ich konnte die Antwort nirgendwo hier finden. Jede Hilfe (mit Erklärungen bitte) würde geschätzt :)

Edit: alle definierten Variablen sind wie folgt:

luserfld10=[] 
bal_fwd=[] 
sdc=[] 
est_read=[] 

usw.

Dateiinhalt Ich bin nicht sicher, wie zu zeigen? Ich hoffe, das ist in Ordnung?

LACCNBR,LAMOUNT1,LUSERFLD4,LUSERFLD5,LUSERFLD6,LUSERFLD8,LUSERFLD9,LUSERFLD10 
1290,-12847.28,VAAA0022179,84889.363,Off Peak - nil,5524.11,,N | N | N 
2540255724,12847.28,VAAA0022179,84889.363,Off Peak - nil,5524.11,,N | N | N 
+1

Sofern Sie den Dateiinhalt und die Definitionen für die Variablen niemand bieten kann dies reproduzieren. Wenn ich du wäre, würde ich das bearbeiten und diese Dinge bereitstellen. –

+1

Sieht so aus, als ob Sie auf eine Liste statt auf eine Zeichenfolge aufgeteilt sind, versuchen Sie 'luserfld10 [0] .split()' – Skycc

+0

Ist die Zeile, die Sie versuchen, "N | N | Y" zu teilen? Wenn ja, warum teilst du dann mit ',', solltest du dich mit '|' –

Antwort

0

Wenn die luserfld10 ist ['N | N | Y']

dann,

luserfld10[0].replace('|', '').split() 

Ergebnis:

['N', 'N', 'Y'] 
0

Auch wenn Sie reparieren die .split Sachen in

bal_fwd, junk, sdc, junk2, est_read=str(luserfld10).split(' ') 

es wird nicht tun, was Sie wollen, weil es die Ergebnisse der Aufteilung lokalen Namen bal_fwd, sdc usw. zuweist, die nur innerhalb der csv_read-Funktion existieren, nicht zu den Namen, die Sie außerhalb der Funktion im globalen Bereich definiert haben .

Sie könnte verwenden global Aussagen Python zu sagen, diese Werte zu den globalen Namen zu vergeben, aber es ist im Allgemeinen am besten mit der global-Anweisung zu vermeiden, es sei denn, Sie wirklich es brauchen. Wenn Sie lediglich eine global-Anweisung verwenden, werden die Zeichenfolgendaten nicht in Ihre bal_fwd-Liste eingefügt. Stattdessen wird der globale Name an Ihre Zeichenfolgedaten gebunden und die Liste wird verworfen. Wenn Sie die Zeichenfolge in die Liste einfügen möchten, müssen Sie .append es, wie Sie mit unique_id getan haben. Sie benötigen dazu nicht global, da Sie gerade keine Zuweisung vornehmen, sondern lediglich das vorhandene Listenobjekt ändern.

Hier ist eine reparierte Version Ihres Codes, die mit dem von Ihnen geposteten Datenmuster getestet wurde.

import csv 

unique_id = [] 
total_amt = [] 
luserfld10 = [] 
bal_fwd = [] 
sdc = [] 
est_read = [] 

def csv_read(file_obj): 
    for line in csv.DictReader(file_obj, delimiter=','): 
     unique_id.append(line["LUSERFLD4"]) 
     total_amt.append(line["LAMOUNT1"]) 
     fld10 = line["LUSERFLD10"] 
     luserfld10.append(fld10) 

     t = fld10.split(' | ') 
     bal_fwd.append(t[0]) 
     sdc.append(t[1]) 
     est_read.append(t[2]) 

if __name__=="__main__": 
    with open("UT_0004A493.csv") as f_obj: 
     csv_read(f_obj) 

    print('id', unique_id) 
    print('amt', total_amt) 
    print('fld10', luserfld10) 
    print('bal', bal_fwd) 
    print('sdc', sdc) 
    print('est_read', est_read) 

Ausgang

id ['VAAA0022179', 'VAAA0022179'] 
amt ['-12847.28', '12847.28'] 
fld10 ['N | N | N', 'N | N | N'] 
bal ['N', 'N'] 
sdc ['N', 'N'] 
est_read ['N', 'N'] 

ich sollte, dass t = fld10.split(' | ') mit erwähnen etwas zerbrechlich ist: Wenn der Separator nicht genau ist' | ' dann wird die Spaltung scheitern. Also, wenn es eine Möglichkeit gibt ist, dass es nicht gerade ein Raum sein könnte jeder Seite des Rohres (|), dann sollten Sie eine Variation von Jinje Vorschlag verwenden:

t = fld10.replace('|', ' ').split() 

Dies ersetzt alle Rohr Zeichen mit Leerzeichen, und teilt sich dann auf Es wird garantiert, dass die Teilfelder korrekt aufgeteilt werden, vorausgesetzt, es gibt mindestens ein Leerzeichen oder eine Pipe zwischen jedem Teilfeld (Jinjes ursprünglicher Vorschlag schlägt fehl, wenn auf beiden Seiten der Pipe beide Leerzeichen fehlen).


Brechen Sie Ihre Daten in separate Listen können nicht eine gute Strategie sein: Sie müssen vorsichtig sein, die Listen synchronisiert zu halten, so dass es ist schwierig, sie zu sortieren oder um Elemente hinzuzufügen oder zu entfernen. Und es ist mühsam, alle Daten als eine Einheit zu manipulieren, wenn Sie sie über ein halbes Dutzend benannter Listen verteilt haben.

Eine Möglichkeit ist, Ihre Daten in ein Wörterbuch von Listen zu setzen:

import csv 
from pprint import pprint 

def csv_read(file_obj): 
    data = { 
     'unique_id': [], 
     'total_amt': [], 
     'bal_fwd': [], 
     'sdc': [], 
     'est_read': [], 
    } 

    for line in csv.DictReader(file_obj, delimiter=','): 
     data['unique_id'].append(line["LUSERFLD4"]) 
     data['total_amt'].append(line["LAMOUNT1"]) 
     fld10 = line["LUSERFLD10"] 

     t = fld10.split(' | ') 
     data['bal_fwd'].append(t[0]) 
     data['sdc'].append(t[1]) 
     data['est_read'].append(t[2]) 

    return data 

if __name__=="__main__": 
    with open("UT_0004A493.csv") as f_obj: 
     data = csv_read(f_obj) 

    pprint(data) 

Ausgang

{'bal_fwd': ['N', 'N'], 
'est_read': ['N', 'N'], 
'sdc': ['N', 'N'], 
'total_amt': ['-12847.28', '12847.28'], 
'unique_id': ['VAAA0022179', 'VAAA0022179']} 

Beachten Sie, dass csv_read verändert nicht direkt alle globalen Variablen. Es erstellt ein Wörterbuch mit Listen und gibt es an den Code zurück, der es aufruft. Dies macht den Code modularer; Der Versuch, große Programme zu debuggen, die Globals verwenden, kann zum Albtraum werden, weil Sie jeden Teil des Programms verfolgen müssen, der diese Globals modifiziert.


Alternativ können Sie die Daten in eine Liste von Wörterbüchern einfügen, eines pro Zeile.

def csv_read(file_obj): 
    data = [] 
    for line in csv.DictReader(file_obj, delimiter=','): 
     luserfld10 = line["LUSERFLD10"] 
     bal_fwd, sdc, est_read = luserfld10.split(' | ') 
     # Put desired data and into a new dictionary 
     row = { 
      'unique_id': line["LUSERFLD4"], 
      'total_amt': line["LAMOUNT1"], 
      'bal_fwd': bal_fwd, 
      'sdc': sdc, 
      'est_read': est_read, 
     } 
     data.append(row) 
    return data 

if __name__=="__main__": 
    with open("UT_0004A493.csv") as f_obj: 
     data = csv_read(f_obj) 

    pprint(data) 

Ausgang

[{'bal_fwd': 'N', 
    'est_read': 'N', 
    'sdc': 'N', 
    'total_amt': '-12847.28', 
    'unique_id': 'VAAA0022179'}, 
{'bal_fwd': 'N', 
    'est_read': 'N', 
    'sdc': 'N', 
    'total_amt': '12847.28', 
    'unique_id': 'VAAA0022179'}] 
Verwandte Themen