我有以下代码:
# File declaration.
infileS = open("single.dat", 'r')
infileD = open("double.dat", 'r')
infileT = open("triple.dat", 'r')
infileHR = open("homerun.dat", 'r')
infileAB = open("atbat.dat", 'r')
infileP = open("player.dat", 'r')
# Fill up the lists.
single = infileS.read()
double = infileD.read()
triple = infileT.read()
homerun = infileHR.read()
atbat = infileAB.read()
player = infileP.read()
single = [item.rstrip() for item in single]
double = [item.rstrip() for item in double]
triple = [item.rstrip() for item in triple]
homerun = [item.rstrip() for item in homerun]
atbat = [item.rstrip() for item in atbat]
player = [item.rstrip() for item in player]
print (single)
打印什么:
['5', '', '3', '', '1', '0', '', '1', '2', '', '6', '', '9', '', '2', '0', '', '4', '', '7']
我不想要''项目。我做错了什么,我该怎么做才能解决这个问题?
所有.dat文件都是简单的数字记事本列表。 " single.dat"是"输入"的数字列表将它们放在不同的行上(中间没有行),看起来像:(减去,当然,包含这些数字的段落之间的空格)
5
3
10
12
6
9
20
4
7
答案 0 :(得分:2)
空字符串(''
)是你strip
所有空格的东西(或者可能是空的)。消除这些问题的最简单方法是使用''
为假的事实,因此您可以通过添加if item.strip()
将其删除到列表推导中。
问题是您在file.read()
的输出上进行迭代,这是单个字符串。 Python中的字符串是可迭代的,但这意味着当您迭代它们时,您将迭代每个字符。所以你正在做的是剥离每个角色并将其添加到你的列表中 - 所以你的所有换行都变成了空字符串,而不是像我想象的那样被删除。
要修复它,请使用文件对象也可迭代的事实,并逐行迭代。这是在Python中逐行读取文件的惯用方法(使用context manager而不是单独的open
调用):
with open('single.dat') as f:
for line in f:
dosomething(line)
因此,在列表理解中使用该模式以及一些过滤,并且您将全部设置:
with open('single.dat') as f:
single = [line.strip() for line in f if line.strip()]
答案 1 :(得分:-1)
过滤掉''可能最简单。例如:
>>> list = ['', 'cat', 'dog', '']
>>> filter(None, list)
['cat', 'dog']