我正在尝试拆分用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
即使你修复了
.split
中的东西它不会做你想做的事情,因为它将分割的结果分配给局部名称
bal_fwd
,sdc
,等等,这些名称只存在于csv_read
函数中,而不是在全局范围内的函数外定义的名称。你知道吗您可以使用
global
语句告诉Python将这些值赋给全局名称,但通常最好避免使用global语句,除非您确实需要它。另外,仅仅使用global
语句不会将字符串数据放入bal_fwd
列表中。相反,它会将全局名称绑定到字符串数据并丢弃列表。如果要将字符串放入列表中,则需要.append
它,就像使用unique_id
一样。您不需要global
,因为您没有执行赋值,您只是在修改现有的list对象。你知道吗这是您的代码的修复版本,使用您发布的数据示例进行了测试。你知道吗
输出
我应该提到,使用
t = fld10.split(' | ')
有点脆弱:如果分隔符不是确切的' | '
,那么分割将失败。因此,如果管道两侧可能没有一个空格(|
),那么您应该使用Jinje建议的变体:这将用空格替换所有管道字符,然后在空白处进行拆分,因此可以保证正确拆分子字段,假设每个子字段之间至少有一个空格或管道(如果管道两侧都缺少空格,Jinje最初的建议将失败)。你知道吗
将数据拆分为单独的列表可能不是一个好的策略:您必须小心保持列表的同步,因此对它们进行排序或添加或删除项是很困难的。当你把所有的数据分散在六个命名列表中时,把它们作为一个单元来处理是很乏味的。你知道吗
一种方法是将数据放入列表字典中:
输出
注意
csv_read
并没有直接修改任何全局变量。它创建一个列表字典,并将其传递回调用它的代码。这使得代码更加模块化;试图调试使用全局变量的大型程序可能会成为一场噩梦,因为您必须跟踪程序中修改这些全局变量的每个部分。你知道吗或者,您可以将数据放入字典列表中,每行一个。你知道吗
输出
如果
luserfld10
是['N | N | Y']
那么
结果:
相关问题 更多 >
编程相关推荐