python3通过定界符将大文件分割成小文件(不是大小,行)

时间:2019-03-09 06:36:18

标签: python python-3.x split

新手在这里。最终任务是学习如何获取两个大Yaml文件并将它们拆分为数百个小文件。我还没有弄清楚如何使用ID#作为文件名,所以一次只能做一件事。

首先:将大文件分成多个文件。这是我的测试数据文件test-file.yml的一小部分。每个帖子单独在一行上都有-分隔符:

-
    ID: 627
    more_post_meta_data_and_content
-
    ID: 628

这是我的代码不起作用。到目前为止,我还不明白为什么:

with open('test-file.yml', 'r') as myfile:
    start = 0
    cntr = 1
    holding = ''
    for i in myfile.read().split('\n'):
        if (i == '-\n'):
            if start==1:
                with open(str(cntr) + '.md','w') as opfile:
                    opfile.write(op)
                    opfile.close()
                    holding=''
                    cntr += 1
            else:
                start=1
        else:
            if holding =='':
                holding = i
            else:
                holding = holding + '\n' + i
    myfile.close()

欢迎所有提示,建议和指针。谢谢。

2 个答案:

答案 0 :(得分:0)

作为一个新手,乍一看,您尝试向输出中写入未声明的变量op。您快要准备好了,只需要遍历opfile并编写内容:

    with open('test-file.yml', 'r') as myfile:
        start = 0
        cntr = 1
        holding = ''
        for i in myfile.read().split('\n'):
            if (i == '-\n'):
                if start==1:
                    with open(str(cntr) + '.md','w') as opfile:
                        for line in opfile:
                            op = line
                            opfile.write(op)
                            opfile.close()
                            holding=''
                            cntr += 1
                else:
                    start=1
            else:
                if holding =='':
                    holding = i
                else:
                    holding = holding + '\n' + i
        myfile.close()

希望这会有所帮助!

答案 1 :(得分:0)

在打开的文件中使用with context时,with将在退出此块时自动为您关闭文件。因此,您无需在任何地方使用file.close()

有一个名为readlines的函数,该函数输出一个生成器,该生成器一次从一个打开的文件中读取一行。这将比read()后跟split()的工作效率更高。想一想。您正在将一个巨大的文件加载到内存中,然后要求CPU用\n字符分割该巨大文本。不是很有效。

您写了opfile.write(op)op在哪里定义?您是否不想在定义的holding中写内容?

尝试以下操作。

with open('test.data', 'r') as myfile:
    counter = 1
    content = ""
    start = True

    for line in myfile.readlines():
        if line == "-\n" and not start:
            with open(str(counter) + '.md', 'w') as opfile:
                opfile.write(content)

            content = ""
            counter += 1
        else:
            if not start:
                content += line

        start = False

    # write the last file if test-file.yml doesn't end with a dash
    if content != "":
        with open(str(counter) + '.md', 'w') as opfile:
            opfile.write(content)