.split()返回空结果

时间:2016-11-25 10:47:58

标签: python python-3.x

我正在尝试拆分我用str()转换的列表,但我似乎没有返回任何结果?

我的代码如下:

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)返回['N | N |是的,这是正确的。 (由于创建csv文件时的系统限制,此字段包含三个单独的值)
所有变量都已定义,我没有收到任何错误,但我的最后三个打印命令返回空列表?

我尝试了dedenting .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

2 个答案:

答案 0 :(得分:0)

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

然后,

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

结果:

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

答案 1 :(得分:0)

即使您修复了<{p>}中的.split内容

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

它不会做你想要的,因为它将拆分的结果分配给仅存在于bal_fwd函数内的本地名称sdccsv_read等,而不是您在全局范围内的函数外定义的名称。

可以使用global语句告诉Python将这些值分配给全局名称,但通常最好避免使用全局语句,除非你真的需要它。此外,仅使用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(' | ')有点脆弱:如果分隔符不是完全 ' | ',则拆分将失败。因此,如果管道两侧可能没有一个空格(|),那么您应该使用Jinje建议的变体:

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'}]