Python--print(xx)内容为空,打印不出内容;原因是文件句柄对象在迭代后,对象内的数据会逐渐清空

一、问题背景

诚如下面的代码所示,执行之后,任何内容都没有被打印出来。

# 读取TXT文件_label-list
with open(LABEL_TO_CLASS, 'r') as flist:
    for num, name in [line.strip().split() for line in flist]:
        dict_name2num[name] = int(num)

SPLIT_ITERS = [TRAIN_txt_path, VAL_txt_path, TEST_txt_path]

# 读取TXT文件_path-label       
for i, txt_path in enumerate(SPLIT_ITERS):
    with open(txt_path, 'r') as flist:
        if i==0:  # Train
            list_file = [line.strip().split() for line in flist]
            for path, label in [line.strip().split() for line in flist]:
                print(path)
                train_whole_paths.append(path)
                train_whole_labels.append(int(label))
        elif i==1:  # Val
            for path, label in [line.strip().split() for line in flist]:
                val_whole_paths.append(path)
                val_whole_labels.append(int(label))
        else:  # Test
            for path, label in [line.strip().split() for line in flist]:
                test_whole_paths.append(path)
                test_whole_labels.append(int(label))

但是实际上,打印list_file,是有内容的。

 

二、解决思路

将对flist文件对象的迭代语句【list_file = [line.strip().split() for line in flist]】注释掉后,再重新执行,就

可以打印出内容了。

# 读取TXT文件_label-list
with open(LABEL_TO_CLASS, 'r') as flist:
    for num, name in [line.strip().split() for line in flist]:
        dict_name2num[name] = int(num)

SPLIT_ITERS = [TRAIN_txt_path, VAL_txt_path, TEST_txt_path]

# 读取TXT文件_path-label       
for i, txt_path in enumerate(SPLIT_ITERS):
    with open(txt_path, 'r') as flist:
        if i==0:  # Train
            # list_file = [line.strip().split() for line in flist]
            for path, label in [line.strip().split() for line in flist]:
                print(path)
                train_whole_paths.append(path)
                train_whole_labels.append(int(label))
        elif i==1:  # Val
            for path, label in [line.strip().split() for line in flist]:
                val_whole_paths.append(path)
                val_whole_labels.append(int(label))
        else:  # Test
            for path, label in [line.strip().split() for line in flist]:
                test_whole_paths.append(path)
                test_whole_labels.append(int(label))

三、原理 

实验代码如下所示,对于列表,即便是被迭代过,后续也能接着迭代。

 

而对于文件对象,实验代码如下:

先创建一个txt文件,一共有5行。

 当先将第一行的内容传给line后,打印出line,然后再直接用read()读完所有内容,下一次直接没办法迭代。 

with open('123.txt', 'r') as f:
    for line in f:
        print(line)
        print(f.read())
        print('Loop Ending.')

# ugyiqvqivew

# asaass
# sadasfa
# ggtrhtr
# adxzch
# Loop Ending.

而如果把read()注释掉,那么就会迭代5次,分别对应每一行。

with open('123.txt', 'r') as f:
    for line in f:
        print(line)
        # print(f.read())
        print('Loop Ending.')

# ugyiqvqivew

# Loop Ending.
# asaass

# Loop Ending.
# sadasfa

# Loop Ending.
# ggtrhtr

# Loop Ending.
# adxzch
# Loop Ending.

有些小伙伴可能会疑惑,为啥每一行的内容和Loop Ending的输出之间隔一行呢?因为每一行的末尾有\n,经过转义后就换行了。 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值