一、问题背景
诚如下面的代码所示,执行之后,任何内容都没有被打印出来。
# 读取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,经过转义后就换行了。