【问题标题】:efficient way to read large data from a file in python从python中的文件中读取大数据的有效方法
【发布时间】:2019-04-18 11:13:47
【问题描述】:

我有 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 开头,一行包含两个数字。这些行将被忽略。需要的数据是 segsitesposition,以及我在 positions 之后的二进制值。每行(二进制值)将对应于矩阵中的一行。

segsites 的数量将对应于位置向量的长度和二进制矩阵中的列数。例如,在第一个示例中,我的 segsites 是 3,因此,我的位置向量中也有 3 个值。我的二进制矩阵的大小为 4 x 3。它是“4”,因为示例中有四行二进制值。

我的代码完成了所有这些。但我只想保留 segsites 小于 5000 的示例。

这只是一个例子。否则我有多达 10000 个 segsites。我制作了一个遍历所有这些文件的代码。对于这些文件中的每一个,它都会获得# of segregating sites,位置并将位置下方的二进制值放入矩阵中。例如,对于第一个示例,矩阵的大小为 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_filereading_file 函数然后读取 segsites、位置和二进制矩阵。但是,我想更改此代码,以便仅存储那些 segsites 为 5000 或更少但不多于的 segsites、位置和二进制矩阵。我不知道如何使用我制作的代码来实现这一点。 另外,你能告诉我一种以我提到的格式读取文件的有效方法吗?因为这段代码很慢。

【问题讨论】:

    标签: python-3.x file-read


    【解决方案1】:

    您可以读取文件,将其转换为 csv,然后再次写入(一次)。然后你可以使用pandas 读取csv并轻松操作

    【讨论】:

    • 但是,如果不将其转换为 csv,我该如何处理仅存储 segsites 小于或等于 5000 的那些 segsites、位置和二进制矩阵的事实。
    • 您无法从中受益。因为“segsites”的数量只有在阅读整个文件后才能知道(如果我理解正确的话)
    • 因此,一旦我阅读了 segsites,我就知道位置向量的相应长度和二进制矩阵的列数是多少。 Segsites 也会在文件中更改。每个样本都有自己的 segsites。例如,我的第一个示例有 3 个 segsite,第二个示例有 6 个 segsite。
    • 因为将此文件格式转换为 csv 格式没有意义。
    • 请给我更多细节。我不知道“segsites”或你的文件结构
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-25
    • 2010-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多