Как зациклить файл .dat и добавить определенный столбец для набора строк в массив - PullRequest
1 голос
/ 24 октября 2019

В файле .dat первая строка [это целое число, которое я назвал S) указывает количество имеющихся наборов, а также количество вариантов на набор. Например, если S равно 21, имеется 21 набор из каждых 21 строки.

Затем, начиная со следующей строки, есть 6 столбцов. Я хочу добавить 4-й столбец для каждого набора из S строк в массив, чтобы сделать некоторые вычисления позже. Я хочу прекратить делать это до строки S * S. Сложность в том, что мне нужно игнорировать (не добавлять) каждую 21-ю строку в наборе, поскольку это фиктивные результаты.

Я не совсем уверен, как это сделать, но вот что я получил на данный момент. Благодарен за любую помощь.

with open('foo.dat') as f:

    S = int(f.readline())  #extracting set number
    print("Sets, S:", S)

    I   = [] 

    for i, lines in enumerate(f):
        columns = lines.split()

        if i < S*S: 

            In = float(columns[3])                                                            
            I.append(In)   #extracting 4th column

    #checking results        
    print(I)
    print("length of I:", len(I))

Пожалуйста, найдите прикрепленную ссылку на пример файла .dat, с которым я работаю: https://pastebin.com/Cgms3efh

Ожидаемый результат:

I1 = [140,66758, 46,745557, 20,931668, 10,599119, 5,4772385, 2,9093667, 1,713973, 1,1483754, 0,83311013, 0,62603209, 0,47950916, 0,37391387, 0,29780616, 0,2431309, 0,20399252, 0,17613667, 0,15656772, 0,14322945, 0,13475736, 0,13030334]

I2 = [46,745557, 28,637786, 16,271265, 9,0978727, 4,9856322, 2,7981477, 1,7304986, 1,1918406, 0,87493924, 0,66197242, 0,5100049, 0,39981398, 0,31993277, 0,2622417, 0,22075246, 0,19110705, 0,17021343, 0,1559358, 0,14684993, 0,14206743]

. ..

ПРИМЕЧАНИЕ. На самом деле мне не нужно сохранять их все, так как я проведу расчет с ними для каждого набора, прежде чем перейти к следующему набору из 21-1 строк. Поэтому массив я могу перезаписать для каждого нового набора строк.

Ответы [ 2 ]

2 голосов
/ 24 октября 2019

Вот простая реализация с пониманием вложенного списка:

with open('test.dat', 'r') as file:
    num = int(file.readline().strip())
    data = [[float(file.readline().split()[3]) for i in range(num)][:-1] for j in range(num)]

Затем вы просто получаете доступ к вашему data[0] для первого набора, data[1] для второго набора и так далее ...

print(data[0])
# [140.66758, 46.745557, 20.931668, 10.599119, 5.4772385, 2.9093667, 1.713973, 1.1483754, 0.83311013, 0.62603209, 0.47950916, 0.37391387, 0.29780616, 0.2431309, 0.20399252, 0.17613667, 0.15656772, 0.14322945, 0.13475736, 0.13030334]
print(data[1])
# [46.745557, 28.637786, 16.271265, 9.0978727, 4.9856322, 2.7981477, 1.7304986, 1.1918406, 0.87493924, 0.66197242, 0.5100049, 0.39981398, 0.31993277, 0.2622417, 0.22075246, 0.19110705, 0.17021343, 0.1559358, 0.14684993, 0.14206743]

Если вам не нужно хранить все данные, вы можете использовать генератор вместо:

def set_gen(filename):
    with open(filename, 'r') as file:
        num = int(file.readline().strip())
        for _ in range(num):
            yield [float(file.readline().split()[3]) for i in range(num)][:-1]

my_sets = set_gen('test.dat')
print(next(my_sets))
1 голос
/ 24 октября 2019

Вы можете использовать оператор по модулю, чтобы определить, используете ли вы 21-й элемент или нет. Если число делится точно на 21, то это 21-я строка набора. Чтобы сделать это более общим, я сделал модуль на основе заданного размера.

with open('query4.txt') as f:
    sets = int(f.readline())  #extracting set number
    limit = sets * sets
    items = []
    print("Sets:", sets, ", limit:", limit)

    for index, line in enumerate(f):
        columns = line.split()
        num = float(columns[3])
        #add one to the index and check if its divisable by the set size.
        if (index + 1) % sets:
            #we got here if this number cannot be devided by the set sizze without a remainder I.E this line is not the last line of the set
            items.append(num)  # extracting 4th column 
        else:
            #we got here if we are on the last line of the set size so print the dta and reset the list.
            print(items)
            items = []
        if index > limit:
            #break the loop when we reach the limit
            break

ВЫБОР ОБРАЗЦА

Sets: 21 , limit: 441
[140.66758, 46.745557, 20.931668, 10.599119, 5.4772385, 2.9093667, 1.713973, 1.1483754, 0.83311013, 0.62603209, 0.47950916, 0.37391387, 0.29780616, 0.2431309, 0.20399252, 0.17613667, 0.15656772, 0.14322945, 0.13475736, 0.13030334]
[46.745557, 28.637786, 16.271265, 9.0978727, 4.9856322, 2.7981477, 1.7304986, 1.1918406, 0.87493924, 0.66197242, 0.5100049, 0.39981398, 0.31993277, 0.2622417, 0.22075246, 0.19110705, 0.17021343, 0.1559358, 0.14684993, 0.14206743]
[20.931668, 16.271265, 11.032549, 6.8871422, 4.1249159, 2.5314457, 1.684505, 1.2087469, 0.90466792, 0.69278056, 0.53932924, 0.42681753, 0.34438866, 0.28428271, 0.24069443, 0.20932984, 0.18709735, 0.171836, 0.16209171, 0.15695167]
...