使用双回车符将大文本文件分成单独的文件

时间:2015-10-19 17:08:17

标签: python file python-2.7 split chunks

我在Windows 7中使用Python 2.7。我有一个大文本文件,我想分成几个较小的文件。该文件的格式目前看起来像这样。 。 。

Double carriage return
Header line
Body (consisting of several lines)
Double carriage return
Header line
Body (consisting of several lines)

我想创建单独的文本文件,使用Header行作为文件名,Body作为文件内容。 Double回车符标识新文件的开头。

我搜索过Stack Overflow但没找到我要找的东西。我是Python的新手,所以任何帮助都会非常感激。

到目前为止我的代码是。 。 。

fh = open(path/file.txt)
data = fh.read()
doc = re.split(r'[\r\n\r\n]',data)
for para in doc:
    header = re.search('^[1-9].+Chapter', para)
    filename = str(header) + ".txt"
    fwrite = open(filename,"w")
    fwrite.write(para)
    fwrite.close()

我想将第一行用作文本文件标题。

2 个答案:

答案 0 :(得分:1)

第一行没有正确打开文件,这应该可以正常运行。保持文件在try Exception

中打开的最佳做法
fh = open('path/file.txt','r')
data = fh.read()
doc = re.split(r'[\r\n\r\n]',data)
for para in doc:
    header = re.search('^[1-9].+Chapter', para)
    filename = str(header) + ".txt"
    fwrite = open(filename,"w")
    fwrite.write(para)
    fwrite.close()

答案 1 :(得分:1)

open的参数是带引号的字符串;你省略了引号。

您的代码将不必要地将整个文件拉入内存 - 这显然不是小文件的问题,而是不必要地限制您的程序。如果不需要一起分析这些行,最好一次读一个到内存中,然后再把它写出来后忘记它。

您的代码硬编码DOS回车,这不仅无味......

您的代码不强制要求分隔符后面的第一行必须包含章节标题。如果这不是一个硬性要求,替换代码将需要一些更改。我认为提醒和中止比从恰好匹配的文件中进一步向下拉东西更好;但是使用重构的代码,后一种方法甚至不可行。

with open('path/file', 'Ur') as input:
    output = None
    for line in input:
        if output is None:
            if 'Chapter' in line and line[0:1].isdigit():
                output = open('.'.join(line.rstrip(), 'txt'), 'w')
            else:
                raise ValueError(
                    'First line in paragraph is not chapter header: '
                    '{}'.format(line.rstrip())
        elif line == '\n':
            output.close()
            output = None
            continue
        output.write(line)