即使你修復
的
.split
東西
它不會做你想做的,因爲它分配拆分到本地名稱bal_fwd
,sdc
,等的結果,只有csv_read
函數內部存在的,而不是名字,你的功能外,在全球範圍內定義。
您可能使用global
語句告訴Python這些值分配給全局名稱,但通常最好是避免使用global語句,除非你真的需要它。另外,僅使用global
語句不會將字符串數據放入bal_fwd
列表中。相反,它會將全局名稱綁定到您的字符串數據並放棄列表。如果你想把字符串放到列表中,你需要.append
它,就像你用unique_id
做的那樣。您不需要global
,因爲您沒有執行任務,您只需修改現有列表對象。
以下是您的代碼的修復版本,並使用您發佈的數據樣本進行了測試。
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)
輸出
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']
我應該指出,使用t = fld10.split(' | ')
是有點脆弱:如果分離不正是' | '
然後,將分離將失敗。所以,如果有一種可能性,即有可能不是一個空格管道(|
)的兩側,那麼你應該用吉尼的建議的變化:
t = fld10.replace('|', ' ').split()
這將替換用空格所有的管道字符,然後分割上假如每個子域之間至少有一個空間或管道(如果管道兩側都缺少兩個空間,Jinje的原始建議將失敗),保證正確拆分子域。
分手您的數據轉換成單獨的列表可能不是一個偉大的戰略:你必須要小心,以保持同步的列表,所以它的棘手對它們進行排序,或者添加或刪除項目。當您將所有數據分散到六個以上的命名列表中時,將所有數據作爲一個單元來操作是很繁瑣的。
一種選擇是把你的數據轉換成列表的詞典:
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)
輸出
{'bal_fwd': ['N', 'N'],
'est_read': ['N', 'N'],
'sdc': ['N', 'N'],
'total_amt': ['-12847.28', '12847.28'],
'unique_id': ['VAAA0022179', 'VAAA0022179']}
注意csv_read
不直接修改任何全局變量。它創建一個列表字典並將其傳回給調用它的代碼。這使代碼更加模塊化;試圖調試使用全局變量的大型程序會變成一場噩夢,因爲你必須跟蹤修改這些全局變量的程序的每一部分。
或者,您可以將數據放入字典列表中,每行一個。
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)
輸出
[{'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'}]
除非您爲變量提供的文件內容和定義,沒有人能重現此。如果我是你,我會編輯並提供這些東西。 –
看起來像你在列表上而不是字符串上分割,試試'luserfld10 [0] .split()' – Skycc
你試圖分割「N | N | Y」的行嗎?如果是,那你爲什麼要用''分割,你應該分割爲'|' –