Python,在打开大量文件后,如何在没有任何预先订购的情况下调用它们进行编写?

时间:2017-06-15 07:19:08

标签: python file-io

我的问题是我必须阅读一个大文本文件(至少几GB),然后在阅读时,根据模式,我会将其中的一部分写入许多输出文本文件之一(约5000)。如果存在这种或那种模式,我需要在这个或那个文件上写。

所以我可以预先创建所有5000个文本文件,但我不知道如何在以后写入特定的文本文件。效率也是一个大问题,但我甚至不在那里。

使其更清晰:有5000种模式,但它们的总数是数亿甚至更多。因此,每当我偶然发现一个特定的模式,我会将其写入其文本文件。但是没有顺序,所以我可能需要稍后调用相同的输出文件1百万行,例如在3行之后,只要我看到它

提前致谢(注意:我也是python语言的初学者,我使用的是3.6)

2 个答案:

答案 0 :(得分:3)

在python中打开文件的内置函数是open()

在您的情况下,我可能会将mode = r用于大文件,将mode = a用于所有其他文件。如果文件不存在,Python将创建一个文件,因此不需要事先创建它们。

在读取大文件时,您只需将要写入的文件的路径指定为字符串,就可以在其上使用字符串格式。

with open(r"/BigFile.txt",mode=r) as InputFile:
    for row in InputFile:

        id = #what you want to have to determine which file to write to

        file_to_write_to = r"/Subfiles/outputfile{}.txt".format(id)

        with open(file_to_write_to,mode="a") as OutputFile:
            OutputFile.write(row + "\n")

with open()语法的优点是您不必调用文件Object上的.close()函数。

此代码的缺点是每个输入块有一个文件打开和关闭操作。在将它们作为批处理导出之前,您可能需要考虑构建几个输出操作的列表,但如果同一文件上有多个输出操作,那么这只会带来时间优势。

BATCH_SIZE = 500
batch_dict = {}

with open(r"/BigFile.txt",mode=r) as InputFile:
    for index,row in enumerate(InputFile):

        id = #what you want to have to determine which file to write to
        if batch_dict.setdefault(str(id),row) is not None:
            batch_dict[str(id)] = batch_dict[str(id)] + row +"\n"

        if index % BATCH_SIZE = 0:
            for batch_id,batch in batch_dict:

                file_to_write_to = r"/Subfiles/outputfile{}.txt".format(id)
                with open(file_to_write_to,mode="a") as OutputFile:
                    OutputFile.write(batch + "\n")

            batch_dict = {}

(代码未经测试,因为我现在没有python 3)

答案 1 :(得分:0)

您应该仅在需要时以附加模式打开文件,写入数据然后关闭它。

with open('my-file-name','a+') as ff:
    ff.write('my-text'+'\n')