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'}]
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. –
Sieht so aus, als ob Sie auf eine Liste statt auf eine Zeichenfolge aufgeteilt sind, versuchen Sie 'luserfld10 [0] .split()' – Skycc
Ist die Zeile, die Sie versuchen, "N | N | Y" zu teilen? Wenn ja, warum teilst du dann mit ',', solltest du dich mit '|' –