首页 > 解决方案 > 从文件中删除以特定字符开头的空记录

问题描述

我有一个包含 DBLP 数据集的文件,其中包含计算机科学中的书目数据。我想删除一些缺少信息的记录。例如,我想删除缺少场地的记录。在这个数据集中,场地后面是“#c”。

在这段代码中,我按手稿标题(“#*”)拆分文档。现在,我正在尝试删除没有场地名称的记录。

输入数据:

#*Toward Connectionist Parsing.

#@Steven L. Small,Garrison W. Cottrell,Lokendra Shastri

#t1982

#c

#index14997


#*A Framework for Reinforcement Learning on Real Robots.

#@William D. Smart,Leslie Pack Kaelbling

#t1998

#cAAAI/IAAI

#index14998

#*Efficient Goal-Directed Exploration.

#@Yury V. Smirnov,Sven Koenig,Manuela M. Veloso,Reid G. Simmons

#t1996

#cAAAI/IAAI, Vol. 1

#index14999

我的代码:

inFile = open('lorem.txt','r')
Data = inFile.read()
data = Data.split("#*")
ouFile = open('testdata.txt','w')
for idx, word in enumerate(data):
    print("i = ", idx)
    if not('#!' in data[idx]):
        del data[idx]
        idx = idx - 1
    else:
        ouFile.write("#*" + data[idx])
ouFile.close()
inFile.close()

预期输出:

#*A Framework for Reinforcement Learning on Real Robots.

#@William D. Smart,Leslie Pack Kaelbling

#t1998

#cAAAI/IAAI

#index14998

#*Efficient Goal-Directed Exploration.

#@Yury V. Smirnov,Sven Koenig,Manuela M. Veloso,Reid G. Simmons

#t1996

#cAAAI/IAAI, Vol. 1

#index14999

实际输出:一个空的输出文件

标签: pythonpython-3.xstring

解决方案


str.find将为您提供子字符串的索引,如果子字符串不存在,则为 -1。

DOCUMENT_SEP = '#*'

with open('lorem.txt') as in_file:
    documents = in_file.read().split(DOCUMENT_SEP)

with open('testdata.txt', 'w') as out_file:
    for document in documents:
        i = document.find('#c')
        if i < 0:  # no "#c"
            continue
        # "#c" exists, but no trailing venue information
        if not document[i+2:i+3].strip():
            continue
        out_file.write(DOCUMENT_SEP)
        out_file.write(document)
  • 我没有手动关闭,而是使用了一个with语句。
  • 无需使用索引;在循环中间删除一个项目会使索引计算变得复杂。
  • 使用正则表达式 like#c[A-Z]..将使代码更简单。

推荐阅读