У меня есть 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_file затем считывает сегменты, позиции и двоичную матрицу. Однако я хочу изменить этот код так, чтобы сохранялись только те сегменты, позиции и двоичные матрицы, у которых сегменты 5000 или меньше, но не больше. Я не знаю, как этого добиться с помощью кода, который я сделал.
Кроме того, можете ли вы сказать мне эффективный способ чтения файла в формате, который я упомянул. Потому что этот код довольно медленный.