使用文本分隔符将25mb .txt文件拆分为较小的文件

时间:2011-01-13 11:45:40

标签: python file string

问候,SO

我是python和Perl的新手。我一直试图解决一个简单的问题,并用语法打结。我希望有人有时间和耐心帮助。 我有一个“.txt”格式的25mb文件,其中包含可追溯到1970年的新闻报道。每个新闻故事都连接到下一个,只有“版权”声明来划分。每个新闻报道都以“XXX文档的XX项”开头。有些元数据会在整个过程中重复出现,我稍后会用它们进行标记。

我希望将这个25mb文件拆分成单独的.txt文件,每个文件包含一个新闻报道(即“DOCUMENTS”和“Copyright”之间的文本,用不同的名称(显然)保存每个文件。

我试图1)打开文件... 2)迭代文件中的行检查eof分隔符,如果不存在则将行写入列表3)将该列表写入单独的小文件。

我在使用计数器更改文件名时遇到很大问题,如何让Python从我离开的地方开始,“搜索”功能是否合适?

到目前为止,我一直在尝试这种方法,完全没有成功:

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. Page 72832)召开了神经系统设备小组会议 医疗器械咨询委员会讨论并提出建议 可能对用于电惊厥的装置进行重新分类 治疗,1月27日至28日。

时间:早上8点。

地点:Hilton Washington DC North / Gaithersburg,Ballroom,620 Perry Parkway, 马里兰州盖瑟斯堡。

联系人:James Engles,800-741-8138 [注:使用代码:3014512513,当 要求提供信息。]

LOAD-DATE:2010年11月28日

语言:英语

TYPE:会议

       Copyright 2011 Federal Information and News Dispatch, Inc.


                           2 of 575 DOCUMENTS

                         The Washington Daybook

                            January 27, 2011

卫生及公共服务部(HHS);食品药品监督管理局(FDA) (F.R. Page 72832)召开了神经系统设备小组会议 医疗器械咨询委员会讨论并提出建议 可能对用于电惊厥的装置进行重新分类 治疗,1月27日至28日。

时间:早上8点。

地点:Hilton Washington DC North / Gaithersburg,Ballroom,620 Perry Parkway, 马里兰州盖瑟斯堡。

联系人:James Engles,800-741-8138 [注:使用代码:3014512513,当 要求提供信息。]

LOAD-DATE:2010年11月28日

语言:英语

TYPE:会议

       Copyright 2011 Federal Information and News Dispatch, Inc.


                           3 of 575 DOCUMENTS


                              FNS DAYBOOK

                       January 12, 2011 Wednesday
                              FUTURE EVENTS

活动:会议 - 健康与人类服务部门(HHS);食物和药物 行政(FDA)(F.R. PAGE 72832); 地点:希尔顿华盛顿特区北/盖瑟斯堡,宴会厅,620 Perry Parkway, 马里兰州盖瑟斯堡 - 2011年1月27日上午8:00

部分:联邦机构和部门 - 期货

长度:72字

主题:卫生及公共服务部(HHS);食品和药品 美国食品和药物管理局(FDA)(F.R.,第72832页)召开神经病学会议 医疗器械咨询委员会的设备小组讨论和制作 关于可能对设备进行重新分类的建议 用于电惊厥治疗,1月27日至28日。

联系人:James Engles,800-741-8138 [注:使用代码:3014512513,当 要求提供信息。]

LOAD-DATE:2011年1月10日

语言:英语

PUBLICATION-TYPE:活动时间表

                  Copyright 2011 Federal News Service
                          All Rights Reserved

2 个答案:

答案 0 :(得分:1)

类似的东西:

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()

我不得不猜测很多东西,因为我不太清楚文件的样子。如果您还有其他问题,请发布文件。

答案 1 :(得分:1)

一路上有几个问题:

  • 在写入小文件时,您在循环迭代器中都使用myfile.readline() - 当您想知道当前内容时,只需使用line线
  • myfile.readline() != 'string'位总是会失败,这实际上不是正则表达式匹配。
  • mysmallfile()['w']看起来过于聪明(如果你使用mysmallfile()函数返回一个用'w'索引的数组或字典来检索L值(!))或者像你一样离开这里的路线:))
  • 您打开一个文件,在其中写入一行,但之后永远不会关闭该文件。当你用完打开的文件描述符时,这是在1000行之后失败的秘诀。

nosklo的建议有很多清理,我希望我的帖子可以帮助你理解他是如何得到他的。 :)