在python 3中读取大数据文件

时间:2019-02-11 08:35:34

标签: python

我是python的新手。我有一个.f06文件(nastran输出文件),它的大小约为1gb,有800万行。 Notepad ++和Textpad无法打开此文件。我想开发一个GUI来打开此文件的类型,并在文本编辑小部件中显示它。但是此操作需要很长时间,这种情况对我没有用。

下面您可以看到我的代码。

文本编辑小部件对象的名称为txtf06。

表单对象名称是表单。

我有两个特定的边界,分别是“网格点力”和“ MSC.NASTRAN工作已创建”。我想将这两个边界之间的所有行写到我的文本编辑小部件中。它将有大约4m条线。

def btnImportClickEvent():
    import re
    fileName = form.tbPath.text(): #.f06 path
    file = open(fileName,'r')

    startFilter = "GRID POINT FORCE" #start point
    endFilter = "MSC.NASTRAN JOB CREATED" #end point

    startRegex = re.compile(startFilter, re.DOTALL)
    endRegex = re.compile(endFilter; re.DOTALL)

    status = True

    for i in file:
        searchObj = startRegex.searc(i)
        if searchObj:
        while (status==True):
            form.txtf06.append(file.readline())
            searchObj = endRegex.search(i)
            if searchObj:
                break
        break
    file.close()

3 个答案:

答案 0 :(得分:0)

您可以分块读取文件,并将数据用于进一步处理。

请参见下面的示例,该文件是按块读取的,它按块返回数据,您可以根据需要对其进行处理。

def read_file_in_chunks(filename, chunk_size = 1000):
    with open(filename, 'r')as fp:
        data = "some string to enter in while loop"
        while data:
            data = fp.read(chunk_size)
            yield data

#usage
filename = r"some file path"
for data in read_file_in_chunks(filename):
    print data

答案 1 :(得分:0)

Python

您可以使用它来提取标记之间的部分,然后使用其他工具(例如numpypandas)进行处理:

def extract_between(infile, outfile, start="GRID POINT FORCE", end="MSC.NASTRAN JOB CREATED"):
    with open(infile, 'r') as i, open(outfile, 'w') as o:
        while not start in i.readline():
            pass
        # found start
        # this part could be written nicer with PEP 572
        line = i.readline()
        while not end in line:
            o.write(line)
            line = i.readline()

sed

通过在sed之类的shell中使用bash,这变得更加容易:

sed -n '/GRID POINT FORCE/,/MSC.NASTRAN JOB CREATED/p' infile.txt | sed '1d;$d' > outfile.txt

第一行sed提取标记之间的每一行(包括标记),第二行sed移除第一行和最后一行(开始和结束标记)。

答案 2 :(得分:0)

考虑使用Steve Doyle的精彩pynastran python库。它们是免费的,允许您直接从op2(或从f06,但不建议)中提取所需的所有数据。 Op2读取更快,更完整。