эффективный способ чтения больших данных из файла в python

#python-3.x #file-read

#python-3.x #файл-чтение

Вопрос:

У меня есть 10000 файлов, и каждый файл содержит 2000 образцов. Каждый файл записывается по следующему шаблону:

 discoal 4 2000 55000 -Pt 1750.204699 17502.046985 -Pre 19252.251684 57756.755051
939889312 676473727

###Example 1
//
segsites: 3
positions: 0.000616 0.001428 0.001500
100
001
101
100

###Example 2
segsites: 6
positions: 0.001843 0.002019 0.002102 0.002431 0.003427 0.004103 
000101
101000
001100
110111
 

Подробная информация о файле:

Каждый файл начинается с discoal и строки с двумя числами. Эти строки следует игнорировать. Необходимые данные — это сегменты, позиция и двоичные значения, которые у меня есть после позиций. Каждая строка (двоичных значений) будет соответствовать строке в матрице.

Количество сегментов будет соответствовать длине вектора позиций и # столбцов в двоичной матрице. Например, в первом примере мои сегменты равны 3, поэтому в моем векторе положения также будет 3 значения. И моя двоичная матрица будет иметь размер 4 x 3. Это ‘4’, потому что в примере есть четыре строки двоичных значений.

Мой код делает все это. Но я хочу сохранить только те примеры, где количество сегментов меньше 5000.

Это всего лишь пример. В противном случае у меня есть сегменты до 10000. Я создал код, который проходит через все эти файлы. И для каждого из этих файлов он получает # сегрегации сайтов, позиций и помещает двоичные значения ниже позиций в матрицу. Пример для первого примера матрица будет иметь размер 4 x 3, а вторая — 4 x 6.

Мой код:

 def reading_filenames(path_to_directory,extension,tot_segsites,positions,snp_matrix):
    """
    This function returns the file names in the directory of interest
    """

    path = path_to_directory   extension 
    files = glob.glob(path)

    i=0
    for file in files:     
        f=open(file, 'r')  
        #print('file : ',file)
        reading_file(f.readlines(),tot_segsites,positions,snp_matrix,i)
        i  = 1

        f.close() 

    return files, snp_matrix

    #return [f for f in os.listdir(path_to_directory) if f.endswith(extension)]

def reading_file(file,tot_segsites,positions,snp_matrix,i):

    flag = False
    length = 0
    counter = 0
    array = np.zeros((chrm_num,6000))
    for line in file:
        if 'segsites:' in line:
            lst = (line.strip('n').split(': '))
            res = int(lst[1])
            tot_segsites.append(res)

        elif 'position' in line:
            lst = line.strip('n').split(': ')
            lst = lst[1:]
            res = [float(k) for k in lst[0].split(' ')]

            for j in range(len(res)):
                positions[i][j] = res[j]

            flag = True

        elif flag:
            lst = line.strip('n')
            reading_snp_matrix(lst,length,chrm_num,counter,array)
            counter  = 1
            flag = True

    snp_matrix.append((array))
    return snp_matrix

def reading_snp_matrix(line,length,chrm_num,counter,array):
    chromosome = list(map(int, line))
    for i in range(len(chromosome)):
        array[counter][i] = chromosome[i]
 

функция reading_filenames просто считывает файлы в папке и для каждого файла вызывает функцию reading_file . Затем функция reading_file считывает сегменты, позиции и двоичную матрицу. Однако я хочу изменить этот код так, чтобы сохранялись только те сегменты, позиции и двоичная матрица, сегменты которых равны 5000 или меньше, но не больше. Я не знаю, как добиться этого с помощью кода, который я сделал.
Кроме того, можете ли вы подсказать мне эффективный способ чтения файла в формате, который я упомянул. Потому что этот код довольно медленный.

Ответ №1:

Вы можете прочитать свой файл, преобразовать его в csv, записать его снова (один раз). Затем вы можете использовать pandas для чтения csv и легко манипулировать им

Комментарии:

1. Но если вместо преобразования его в csv, как я могу позаботиться о том, чтобы сохранялись только те сегменты, позиции и двоичная матрица, сегменты которых меньше или равны 5000.

2. Вы не можете извлечь из этого выгоду. Поскольку количество «сегментов» может быть известно только после чтения всего файла (если я правильно понимаю)

3. Итак, как только я прочитаю сегменты, я знаю, какова будет соответствующая длина вектора позиций и # столбцов двоичной матрицы. Сегменты также будут меняться внутри файла. Каждый образец имеет свои собственные сегменты. Например, мой первый пример имеет 3 сегсайта, а второй — 6 сегсайтов.

4. Потому что преобразование этого формата файла в формат csv не имеет смысла.

5. Пожалуйста, дайте мне более подробную информацию. Я не знаю «сегменты» или вашу файловую структуру