为什么在Python中剥离换行符会创建一个空格作为列表项?

时间:2014-03-19 22:34:11

标签: python-3.x newline

我有以下代码:

# 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 

2 个答案:

答案 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']