为什么我明确要求python不返回空列表?

2024-04-23 11:30:53 发布

您现在位置:Python中文网/ 问答频道 /正文

提前道歉-我是新的编码,所以这可能是一个愚蠢的问题!在

{I}从本地文件中随机读取一个文本,然后从列表中读取。在

但是,我不想打印任何空行,只打印包含文本的行。在

所以我尝试使用以下代码:

import random

with open('C:\\big.txt', 'r') as f:
    while True:
        random_line_str = random.choice(f.readlines())
        random_line_lst = random_line_str.split()
        if random_line_lst != []:
            print(random_line_lst)
            break

因此,对于包含文本的行来说,这很好。但偶尔也会出现以下错误:

^{pr2}$

老实说,我不知道这是怎么回事。。。在

有什么办法避免这种情况发生,只返回包含文本的行吗?在

干杯!在


Tags: 文件代码文本importtxt编码列表with
3条回答

print out if random_line_lst is not []

不,你没有检查。而是检查列表变量random_line_lst是否不存在于[]中,因为[]是空的,并且其中不存在任何内容,所以总是正确的。所以if random_line_lst not in []:检查不正确。在

您不需要检查:

if len(random_line_lst) > 0:

或者一个捷径(和更好的形式)是检查

^{pr2}$

因为空列表是假的。在

另外,您不能在循环内调用f.readlines()always。在循环开始之前,您需要将这些行保存在变量中,否则下次循环运行时将得到一个IndexError。原因是在f.readlines()的第一次调用中,整个文件被读取,而在下一次调用中,文件位置已经在文件末尾,所以下次读取将返回空列表,除非您寻求文件的零位置。对于您的情况,您只需将readlines()调用移出循环。在

with open('C:\\big.txt', 'r') as f:
    lines = f.readlines()
    while True:
        random_line_str = random.choice(lines)

此行不检查项是否为空列表,而是检查该项是否在空列表中,这将始终为false(意味着item not in []将始终为true):

if random_line_lst not in []:

由于bool([])为False,您可以这样做:

^{pr2}$

如果要显式检查空列表,请使用!=运算符。在

if random_line_lst != []:

使用上面的代码,您的代码将变成:

import random

with open('C:\\big.txt', 'r') as f:
    while True:
        random_line_str = random.choice(f.readlines())
        random_line_lst = random_line_str.split()
        if random_line_lst:
            print(random_line_lst)
            break

编辑

对于random.choice,问题是您在f.readlines()上反复调用random.choice。Readlines只在第一次调用时返回每一行,之后只返回一个空序列。random.choice无法从空序列中选择项目。更好的策略是:

import random

with open('C:\\big.txt', 'r') as f:
    lines = f.readlines()
    while True:
        random_line_str = random.choice(lines)
        random_line_lst = random_line_str.split()
        if random_line_lst:
            print(random_line_lst)
            break

或者,如果您可以摆脱随机性,请使用以下方法:

with open('C:\\big.txt', 'r') as f:
    for line in f:
        line_lst = line.split()
        if line_lst:
            print(line_lst)
            break

我觉得您可以在这种情况下使用strip方法,因为即使行是空的,您仍然会有与该行相关联的回车符。所以你可以检查以下情况

line.strip() != '' #checking if the line is empty by removing the Carriage return 

with open('fdf.txt','r') as f:
     for line in f:
        if line.strip() != '' :
            print(line)

希望有帮助。在

相关问题 更多 >