我是Pyhton的初学者,目前正在尝试编写一个小文件,将文件的行分成火车和测试集。代码为每个FOLD
两个文件(此处为5 * 2),一列火车和一个测试文件生成。第一个训练/测试文件(即第一次循环运行)是无问题生成的,其他的也是创建的,但它们都是空的。您可以在下面找到我的代码段:
for shuffledFile in os.listdir(INPUT_DIR_S):
with open(INPUT_DIR_S + shuffledFile, 'r') as inputFile:
fold = 1
pos = 0
while fold <= FOLD:
content = inputFile.readlines()
step = len(content)/FOLD
testSet = []
trainSet = []
for element in content[pos:step*fold]:
testSet.append(element)
content.remove(element)
with open(create_folders(shuffledFile) + "/" + os.path.splitext(shuffledFile)[0] + "_TEST" + str(fold), 'w') as testFile:
for result_line in testSet:
testFile.write(str(result_line))
for element in content:
trainSet.append(element)
with open(create_folders(shuffledFile) + "/" + os.path.splitext(shuffledFile)[0] + "_TRAIN" + str(fold), 'w') as trainFile:
for result_line in trainSet:
trainFile.write(str(result_line))
fold += 1
pos += step
我还使用了调试器,发现content
存在问题,因为在第一次迭代后它是空的。
但我不知道为什么会发生这种情况以及我实际需要做些什么来解决它。对于那些熟悉Python的人来说,这可能是一个非常基本和简单的问题,如果有人可以解释我的实际问题,我会非常感激。谢谢大家的时间和精力。
答案 0 :(得分:3)
文件对象的行为类似于文件中的行的迭代器。在文件对象上调用delete s.a
时,将消耗迭代器中的所有项。对同一文件对象的readlines()
的后续调用将返回一个空列表。
因此,如果需要多次遍历文件行,则需要重置迭代器或将第一次调用返回的行列表存储到单独的变量中并迭代它可以根据你的需要多次使用。
答案 1 :(得分:1)
假设你想要4/5的数据进行训练和1/5测试,如果你随机化你的数据,那就是将整个数据集拆分一次:
import random
lines = open("...").readlines()
random.shuffle(lines)
fold = len(lines)/5
train = lines[:-fold]
test = lines[-fold:]