.split()返回空结果

2024-04-19 15:52:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试拆分用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 | 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

Tags: csvobj列表readlinereaderfileest
2条回答

即使你修复了.split中的东西

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

它不会做你想做的事情,因为它将分割的结果分配给局部名称bal_fwdsdc,等等,这些名称只存在于csv_read函数中,而不是在全局范围内的函数外定义的名称。你知道吗

您可以使用global语句告诉Python将这些值赋给全局名称,但通常最好避免使用global语句,除非您确实需要它。另外,仅仅使用global语句不会将字符串数据放入bal_fwd列表中。相反,它会将全局名称绑定到字符串数据并丢弃列表。如果要将字符串放入列表中,则需要.append它,就像使用unique_id一样。您不需要global,因为您没有执行赋值,您只是在修改现有的list对象。你知道吗

这是您的代码的修复版本,使用您发布的数据示例进行了测试。你知道吗

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

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

那么

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

结果:

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

相关问题 更多 >