我正在尝试拆分我用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
答案 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
函数内的本地名称sdc
,csv_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'}]