【问题标题】:Splitting 25mb .txt file into smaller files using text delimiter使用文本分隔符将 25mb .txt 文件拆分为较小的文件
【发布时间】:2011-01-13 11:45:39
【问题描述】:

问候,所以

我是 python 和 Perl 的新手。我一直在尝试解决一个简单的问题,并与语法结下了不解之缘。我希望有人有时间和耐心提供帮助。 我有一个“.txt”格式的 25mb 文件,其中包含可追溯到 1970 年的新闻通讯文章。每个新闻故事都连接到下一个新闻故事,只有“版权”声明要分隔。每个新闻报道都以“XXX DOCUMENTS 中的第 XX 项”开头。某些元数据自始至终重复,我稍后将使用这些元数据进行标记。

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

我正在尝试 1) 打开文件... 2) 遍历文件中的行检查 eof 分隔符,如果不存在,则将该行写入列表 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.   

感谢您的时间和耐心。

研发

这是文本文件的示例:

                           1 of 575 DOCUMENTS

                         The Washington Daybook

                            January 28, 2011

卫生与公众服务部 (HHS);食品和药物管理局 (FDA) (F.R. Page 72832) 召开了 医疗器械咨询委员会讨论并提出建议 指示用于电痉挛的设备的可能重新分类 治疗,1 月 27 日至 28 日。

时间:上午 8 点

位置:华盛顿特区北/盖瑟斯堡希尔顿酒店,宴会厅,620 Perry Parkway, 马里兰州盖瑟斯堡

联系人:James Engles,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. Page 72832) 召开了 医疗器械咨询委员会讨论并提出建议 指示用于电痉挛的设备的可能重新分类 治疗,1 月 27 日至 28 日。

时间:上午 8 点

位置:华盛顿特区北/盖瑟斯堡希尔顿酒店,宴会厅,620 Perry Parkway, 马里兰州盖瑟斯堡

联系人:James Engles,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. PAGE 72832); 地点:希尔顿华盛顿特区北/盖瑟斯堡,宴会厅,620 Perry Parkway, 马里兰州盖瑟斯堡——2011 年 1 月 27 日上午 8:00

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

长度:72 字

主题:卫生与公众服务部 (HHS);食品药品 管理局 (FDA) (F.R. Page 72832) 召开神经病学会议 医疗器械咨询委员会器械小组讨论并制定 关于可能的器械重新分类的建议 用于电休克疗法,1 月 27-28 日。

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

加载日期:2011 年 1 月 10 日

语言:英语

PUBLICATION-TYPE:活动时间表

                  Copyright 2011 Federal News Service
                          All Rights Reserved

【问题讨论】:

  • 你能提供文件的sn-p吗?

标签: python file string


【解决方案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()

我不得不猜测很多事情,因为我不确切知道文件的外观。如果您还有其他问题,请发布文件。

【讨论】:

  • 你们都是美丽的人。感谢您的尝试。我通常不只是发帖寻找答案,而且我对 Python 书籍很了解,但我只需要一条腿。再次感谢您的尝试。它不太有效(但也没有出错)。文件如下所示:
  • @user574141: 只需提供文件的小sn-p即可
【解决方案2】:

沿途的几个问题:

  • myfile.readline() != 'string' 位总是会失败,这实际上不是正则表达式匹配。
  • mysmallfile()['w'] 看起来过于聪明(如果您使用 mysmallfile() 函数返回一个以 'w' 为索引的数组或字典来检索 L 值(!)),或者就像您在这里偏离了方向 :)
  • 您打开一个文件,在其中写入一行,但从不关闭该文件。当您用完打开的文件描述符时,这是在 1000 行之后失败的秘诀。

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

【讨论】:

  • 关于第 3 点:是的,我认为它只需要 mysmallfile = ... 文件描述符:我认为 Python 的垃圾收集器会在您遇到问题之前关闭旧的文件句柄。不过,关闭它们仍然是一种好习惯。
  • 哇 ;) 友好的小语言可以为您关闭打开的文件。 :)
猜你喜欢
  • 2011-07-13
  • 1970-01-01
  • 2013-08-05
  • 2012-06-26
  • 1970-01-01
  • 1970-01-01
  • 2018-08-16
  • 2013-04-23
相关资源
最近更新 更多