我在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()
我想将第一行用作文本文件标题。
答案 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)