Python:如果len(list)在不同情况下给出不同的结果?

时间:2018-06-01 08:41:30

标签: python list printing

我正在尝试用Python编写一个音乐程序,它将用户在文本文件中编写的一些音乐转换为midi。我在这个阶段对python并不是特别有经验,所以我不确定这个问题背后的原因是什么。我正在尝试为程序编写源文件解析器,并且此过程的一部分是创建一个包含文本文件的所有行的列表,并将每行拆分为自己的列表以使其更易于使用。我成功地做到了,但是有一个问题。

我希望代码忽略只有空格的行(因此,用户可以使其文件至少具有可读性,而不会将所有行一个放在另一个上面),但是我似乎无法弄清楚如何做到这一点。我试过这个

with open(path, "r") as infile:
    for row in infile:
        if len(row):
            srclines.append(row.split())

这个确实工作就创建行列表并分隔每个单词而言,但它仍然附加只有空格的空行...我通过这样做证实了这一点

for entry in srclines:
    print entry

例如,

['This', 'is']
[]
['A', 'test']

原文为

This is

A test

但奇怪的是,如果在打印阶段我做了另一个len()检查,那么空行实际上是忽略就像我想要的那样,它看起来像这样

['This', 'is']
['A', 'test']

这是什么原因?这是否意味着我只能查看列表并在生成它后删除空条目?或者我只是做行导入代码错了?我正在使用python 3.6来测试这段代码

3 个答案:

答案 0 :(得分:1)

row包含换行符,因此它不是空的。但row.split()找不到任何非空白字符,因此返回一个空列表。

使用

if len(row.strip()):

忽略换行符(以及任何其他前导/尾随空格)。

或更简单:

if row.strip():

因为空字符串是假的。

答案 1 :(得分:0)

尝试创建list comprehension

with open('d.txt', "r") as infile:
    print([i.strip().split() for i in infile if i.strip()])

输出:

[['This', 'is'], ['A', 'test']]

答案 2 :(得分:0)

testdoc.txt有很多空行;但在输出中它们已经出局;

src = 'testdoc.txt'
with open(src, 'r') as f:
    for r in f:
        if len(r) > 1:
            print(r.strip())

现在你可以将这些全部列入列表或列表中,而不是打印任何符合你的进一步逻辑的