python行在写入fi时连接自身

2024-04-16 05:50:50 发布

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

我使用python为10倍交叉验证生成训练和测试数据,并将数据集写入2x10个分开的文件(每个折叠写入一个训练文件和一个测试文件)。奇怪的是,在向文件写入数据时,总是有一行“丢失”。实际上,它甚至可能不会“丢失”,因为我后来发现文件中间的某一行(只有一行)会将自己连接到上一行。因此,输出文件应该如下所示(总共应该有39150行):

44 1 90 0 44 0 45 46 0 1
55 -3 95 0 44 22 40 51 12 4
50 -3 81 0 50 0 31 32 0 1
44 -4 76 0 42 -30 32 34 2 1

然而,我不断得到39149行,文件中间的某个地方似乎像这样一团糟:

44 1 90 0 44 0 45 46 0 1
55 -3 95 0 44 22 40 51 12 450 -3 81 0 50 0 31 32 0 1
44 -4 76 0 42 -30 32 34 2 1

我的代码:

def k_fold(myfile, myseed=1, k=10):
    # Load data
    data = open(myfile).readlines()

    # Shuffle input
    random.seed = myseed
    random.shuffle(data)

    # Compute partition size given input k
    len_total = len(data)
    len_part = int(math.floor(len_total / float(k)))

    # Create one partition per fold
    train = {}
    test = {}
    for i in range(k):
        test[i] = data[i * len_part:(i + 1) * len_part]
        train[i] = data[0:i * len_part] + data[(i + 1) * len_part:len_total]

    return train, test

if __name__ == "__main__":
    path = '....'  #some path and input
    input = '...'

    # Generate data
    [train, test] = k_fold(input)

    # Write data to files
    for i in range(10):
        train_old = path + 'tmp_train_' + str(i)
        test_old = path + 'tmp_test_' + str(i)

        trainF = open(train_old, 'a')
        testF = open(test_old, 'a')

        print(len(train[i]))

奇怪的是,我对训练和测试数据集也做了同样的事情。测试数据集输出正确的文件(4350行),但训练数据集存在上述问题。我确信函数返回39150行训练数据,所以我认为问题应该出在文件编写部分。有人知道我怎么可能做错了吗?提前谢谢!你知道吗


Tags: 文件数据pathtestinputdatalentrain
1条回答
网友
1楼 · 发布于 2024-04-16 05:50:50

我假设双倍长度行的前半部分是原始文件的最后一行。你知道吗

readlines(或通过对文件进行迭代)返回的行仍将以LF字符'\n'结束,但如果文件没有以空行结束,则最后一行除外。在这种情况下,您所做的洗牌将把'\n'行放在'data'中间的某个地方。你知道吗

要么在原始文件中附加一个空行,要么在处理之前strip所有行,然后在写回文件时将换行符添加到每一行。你知道吗

相关问题 更多 >