使用文本分隔符将25mb .txt文件拆分为较小文件
大家好,SO
我刚开始学习Python和Perl,最近在尝试解决一个简单的问题,但在语法上遇到了很多麻烦。希望有人能抽出时间和耐心来帮我一下。
我有一个25MB的文本文件,里面包含从1970年开始的新闻稿。每篇新闻稿是连在一起的,只有“版权”声明用来分隔。每篇新闻的开头都是“第XX项,共XXX份文件”。文件中有一些重复的元数据,我打算稍后用这些来做标签。
我想把这个25MB的文件拆分成多个单独的文本文件,每个文件只包含一篇新闻稿(也就是“文件”和“版权”之间的内容),并且每个文件的名字都不一样。
我想做的步骤是:1)打开文件... 2)逐行检查文件,查看是否有结束符,如果没有,就把这一行写入一个列表 3)把这个列表写入一个单独的小文件。
我在用计数器更改文件名时遇到了很大的问题,还有就是如何让Python从我上次停止的地方继续,是不是可以用“seek”函数?
到目前为止,我尝试了这种方法,但完全没有成功:
myfile = open ("myfile.txt", 'r')
filenumber = 0
for line in myfile.readline():
filenumber += 1
w=0
while myfile.readline() != '\s+DOCUMENTS\s*\n'
### read my line into a list
mysmallfile()['w'] = [myfile.readline()]
w += 1
output = open('C:\\Users\\dunner7\\Documents\###how do I change the filename each iteration???', 'w')
output.writelines(mysmallfile)
###go back to start.
谢谢你的时间和耐心。
RD
这是文本文件的一个示例:
1 of 575 DOCUMENTS
The Washington Daybook
January 28, 2011
健康与人类服务部(HHS);食品和药物管理局(FDA)
(F.R. 第72832页)召开神经设备小组会议,
医疗设备咨询委员会讨论并提出关于可能重新分类用于电休克疗法的设备的建议,时间为1月27日至28日。
时间:早上8点。
地点:希尔顿华盛顿特区北/盖瑟斯堡,舞厅,620佩里公园道,
盖瑟斯堡,马里兰州。
联系人:詹姆斯·恩格尔斯,800-741-8138 [注意:拨打信息时请使用代码:3014512513.]
加载日期:2010年11月28日
语言:英语
类型:会议
Copyright 2011 Federal Information and News Dispatch, Inc.
2 of 575 DOCUMENTS
The Washington Daybook
January 27, 2011
健康与人类服务部(HHS);食品和药物管理局(FDA)
(F.R. 第72832页)召开神经设备小组会议,
医疗设备咨询委员会讨论并提出关于可能重新分类用于电休克疗法的设备的建议,时间为1月27日至28日。
时间:早上8点。
地点:希尔顿华盛顿特区北/盖瑟斯堡,舞厅,620佩里公园道,
盖瑟斯堡,马里兰州。
联系人:詹姆斯·恩格尔斯,800-741-8138 [注意:拨打信息时请使用代码:3014512513.]
加载日期:2010年11月28日
语言:英语
类型:会议
Copyright 2011 Federal Information and News Dispatch, Inc.
3 of 575 DOCUMENTS
FNS DAYBOOK
January 12, 2011 Wednesday
FUTURE EVENTS
事件:会议 - 健康与人类服务部(HHS);食品和药物管理局(FDA) (F.R. 第72832页);
地点:希尔顿华盛顿特区北/盖瑟斯堡,舞厅,620佩里公园道,
盖瑟斯堡,马里兰州 -- 2011年1月27日 上午8:00
部分:联邦机构和部门 - 未来
长度:72个字
主题:健康与人类服务部(HHS);食品和药物管理局(FDA) (F.R. 第72832页)召开神经设备小组会议,
医疗设备咨询委员会讨论并提出关于可能重新分类用于电休克疗法的设备的建议,时间为1月27日至28日。
联系人:詹姆斯·恩格尔斯,800-741-8138 [注意:拨打信息时请使用代码:3014512513.]
加载日期:2011年1月10日
语言:英语
出版类型:事件日程
Copyright 2011 Federal News Service
All Rights Reserved
2 个回答
在这个过程中遇到了几个问题:
- 你在循环中和写入小文件时都用了
myfile.readline()
,其实只需要在想知道当前行内容的时候用line
就可以了。 myfile.readline() != 'string'
这一部分总是会失败,因为这并不是在做正则表达式匹配。mysmallfile()['w']
看起来有点复杂(如果你是用mysmallfile()
函数返回一个数组或字典,并用 'w' 来获取某个值的话),或者你可能是走错方向了 :)- 你打开了一个文件,写了一行内容进去,但却没有关闭这个文件。这会导致在写入1000行后因为打开的文件描述符用完而出错。
nosklo的建议中有很多需要整理的地方,希望我的这段话能帮助你理解他是怎么得出这些结论的。 :)
大概是这样的:
filenumber = 0
outfile = None
with open('source_file.txt') as f:
for line in f:
if line.strip() == 'DOCUMENTS':
filenumber += 1
outfile = open('result%03d.txt' % filenumber, 'w')
elif line.strip().startswith('Copyright') and outfile:
outfile.close()
outfile = None
elif outfile:
outfile.write(line)
if outfile:
outfile.close()
我得猜很多东西,因为我不太清楚这个文件到底长什么样。如果你还有其他问题,可以把文件发上来。