从一个文件读取并写入两个不同的文件会产生意想不到的结果

2024-04-26 14:50:57 发布

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

我试图使用Python从Slurm输出文件中提取一些值,但是write()方法似乎没有按预期工作(或者我不太了解它的用法)。你知道吗

Link下载输出文件slurm-5089.out

仅提取值并将其放入两个单独的文件中是成功的:

for line in f:
    if line[:2] == "nu":
        nuof.write(line[5:])
    if line[:2] == "C ":
        Cof.write(line[4:])

但是,当我试图将值(每个类别/文件150个)划分为子类别(nu SVC或C-SVC,每个值30个)时,我提到,在属于特定子类别的每组值之前,它不会给出预期的结果,这是我用来这样做的最后一段代码:

for line in f:
    if line[:4] == "**Tr":
        if i in nu:
            print(i)
            print(type[i])
            nuof.write(type[i]+'\n')
            print(line)
            i += 1
        if  i in C:
            print(i)
            print(type[i])
            Cof.write(type[i]+'\n')
            print(line)
            i += 1

对于我打开的文件,列出了我使用的nuCtype和计数器i,这是它们的初始化:

from __future__ import print_function

i = 0

nu = [0,1,2,3,4]
C = [5,6,7,8]

type = ['-----nu-SVC-----', '-----nu-SVC-----', '-----nu-SVC-----', '-----nu-SVC-----', '-----nu-SVC-----', '-----C-SVC-----', '-----C-SVC-----', '-----C-SVC-----', '-----C-SVC-----']

Cof = open('C_values', 'w')
nuof = open('nu_values', 'w')
f = open('slurm-5089.out', 'r')

这就是我如何在我的C_values文件中添加第一个-----def-----

Cof.write('-----def-----\n')

Link下载我在C_values文件中得到的输出。你知道吗

Link下载我在nu_values文件中得到的输出。你知道吗

这就是我计划得到的:

-----def-----
1.067648
1.699384
1.137877
2.148189
327.390817
2.668285
1.015005
1.834085
1.085050
2.512783
330.863862
2.492146
1.016106
1.741183
0.905885
2.451512
477.157341
2.679206
1.118905
1.952953
1.071948
2.459619
400.765942
2.798353
0.783165
1.990212
0.877010
2.093311
331.349704
2.671817
-----C-SVC-----
0.121222
0.196481
0.126245
0.350959
9036.687632
0.459966
0.111442
0.213469
0.128784
0.430376
8188.026398
0.436184
0.118351
0.201235
0.108417
0.400938
10286.065268
0.433921
0.129255
0.226374
0.126481
0.482451
13273.184496
0.525713
0.097013
0.236698
0.105254
0.344640
6230.513754
0.458801
-----C-SVC-----
16.107007
21.039873
16.553491
30.173238
1674.267295
35.782899
15.238036
20.423749
16.830935
31.339246
1698.550375
31.147013
16.274621
20.223880
16.434865
31.521544
2353.794493
36.805332
16.764180
23.052520
17.781023
31.867347
2182.786987
32.875505
13.401091
23.094557
14.890684
25.336002
1653.916156
34.239836
-----C-SVC-----
1.067648
1.699384
1.137877
2.148189
327.390817
2.668285
1.015005
1.834085
1.085050
2.512783
330.863862
2.492146
1.016106
1.741183
0.905885
2.451512
477.157341
2.679206
1.118905
1.952953
1.071948
2.459619
400.765942
2.798353
0.783165
1.990212
0.877010
2.093311
331.349704
2.671817
-----C-SVC-----
2.319126
3.974477
2.463397
7.358145
130.813731
9.923179
2.175899
4.486890
2.503507
9.056446
129.852183
9.817307
2.256106
4.008876
2.078878
8.397495
113.754769
9.262230
2.685915
4.782272
2.459403
11.044663
120.761463
10.852858
1.885747
4.804282
1.992187
8.006820
118.607456
10.239223

C_values文件中的某些部分实际上组织得很好,这些值被拆分为精确的预期数(每个子类别30个值),这是最后2组值,从-----def-----到第一个-----C-SVC-----正好有90个值,代表3个子类别;在本例中(仅适用于C_values),值应该被分成5部分,即文件中有多少分隔符[标题],这证明计数实际上执行得很好,但我不太明白循环是如何与输出文件中的最后两个-----C-SVC-----以及90个值组一起工作的,我试着编写不同的代码,但是没有一个有效,而且所提供的代码与我想要的结果非常接近,是我的内置write()方法有什么问题,还是我在这里遗漏了什么问题?你知道吗


Tags: 文件inifdeftypelinelink类别
1条回答
网友
1楼 · 发布于 2024-04-26 14:50:57

我走了另一条路,它给了我想要的结果,我试着写下 nu值和C值到nu_valuesC_values文件,同时当计数器(变量i)达到某个数字(变量count)时,在这种情况下,它是30)算法从type[]列表中写入所选消息(在我的上一段代码中,我将其更改为tp[],因为vim编辑器将其突出显示为python关键字),然后它将0分配给i,以便重新开始,问题是,即使它提供了非凡的性能(对于一个245 MB大小的文件来说,几乎需要4分钟),它调用函数中的一个函数,然后读取输入文件(sys.argv[1]),首先计算以nuC开头的行数,然后开始写过程(因此它有点像重复相同的过程),但无论如何这是我的解决方案:

tp = [' -C1  \n', '  C2  \n', '  -C3  -\n', '  -C4  -\n', '  -N1  -\n', '  -N2  -\n', '  -N3  -\n', '  -N4  -\n']


def line_counter():
    count = 0
    f = open(sys.argv[1], 'r')
    for line in f.xreadlines():
        if line[:2] == "nu":
            count += 1
        if line[:2] == "C ":
            count += 1
    f.close()
    return count


def to_file():
    Cof = open('C_values_'+sys.argv[1], 'w')
    nuof = open('nu_values_'+sys.argv[1], 'w')
    f = open(sys.argv[1], 'r')
    Cof.write("  -Cdef  -\n")
    nuof.write("  -Ndef  -\n")
    count = (line_counter()/10)
    i = 0
    j = 0
    k = 4
    for line in f:
        if line[:2] == "C ":
            i += 1
            Cof.write(line[4:])
            if i == count:
                if j in (0,1,2,3):
                    Cof.write(tp[j])
                i = 0
                j += 1
        if line[:2] == "nu":
            i += 1
            nuof.write(line[5:])
            if i == count:
                if k in (4,5,6,7):
                    nuof.write(tp[k])
                i = 0
                k += 1
    f.close()
    nuof.close()
    Cof.close()
    print("Finished!")

相关问题 更多 >