2016-11-25 180 views
0

我想分裂一個我用str()轉換的列表,但是我似乎沒有返回任何結果?.split()返回空結果

我的代碼如下:

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) 

打印(luserfld10)返回['N | N | Y']這是正確的。 (由於創建csv文件時的系統限制,該字段包含三個單獨的值)
所有變量都已定義,我沒有收到任何錯誤,但是最近三次打印命令返回空列表?

我試着去壓縮.split()行,但是然後我只能解壓縮一個值。

我如何讓他們每個返回N或Y?

爲什麼它不工作,因爲它是?

我確定這很明顯,但這是我編碼的第一週,我在這裏的任何地方都找不到答案。任何幫助(請說明),將不勝感激:)

編輯:所有定義的變量如下:

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

文件內容我不能確定如何顯示?我希望這樣可以嗎?

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

除非您爲變量提供的文件內容和定義,沒有人能重現此。如果我是你,我會編輯並提供這些東西。 –

+1

看起來像你在列表上而不是字符串上分割,試試'luserfld10 [0] .split()' – Skycc

+0

你試圖分割「N | N | Y」的行嗎?如果是,那你爲什麼要用''分割,你應該分割爲'|' –

回答

0

如果luserfld10['N | N | Y']

然後,

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

結果:

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

即使你修復

.split東西

它不會做你想做的,因爲它分配拆分到本地名稱bal_fwdsdc,等的結果,只有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'}]