python - 从文件中删除以特定字符开头的空记录
问题描述
我有一个包含 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
实际输出:一个空的输出文件
解决方案
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]..
将使代码更简单。
推荐阅读
- bash - 我想获取gcs每个目录下的最新文件名
- python - 如何使用 geopandas 迭代地对 shapefile 中的特征进行 sjoin,然后对分类数据进行编码?
- ruby-on-rails - 表单错误验证时,主动存储可防止客户端重新上传文件
- c# - 我如何过滤准备物理计数
- python - 如何从 Python 或 CLI 在 Firefox 中打开新标签页?
- c++ - 如何在不使用命令行的情况下获取 optarg 的值?
- java - spring(无法理解并解决以下错误)
- python - 如何在 Python 中使用 S3 存储桶和 Boto3 将图像上传到 MongoDB
- c# - 需要帮助在 HotChocolate Filters 中创建求和聚合操作
- django - + 不支持的操作数类型:“QuerySet”和“QuerySet”