使用 Python 在文件行中搜索列表条目

2024-02-28

我有一个包含数万行 ASCII 文本的文本文件。我有一个包含数百个要搜索的关键字的列表,单独考虑每一行。最初,如果有任何匹配项,我想返回(打印到屏幕或文件)该行,但最终我想根据匹配数对返回的行进行排名或排序。

所以,我的清单是这样的......

keywords = ['one', 'two', 'three']

我的思路是这样的:

myfile = open('file.txt')
for line in myfile:
    if keywords in line:
        print line

但将其从伪代码转换为工作代码并没有发生。

我还考虑过使用正则表达式:

print re.findall(keywords, myfile.read())

但这让我走上了一条充满不同错误和问题的道路。

如果有人可以提供一些指导、语法或代码片段,我将不胜感激。


您无法测试字符串中是否存在列表。您可以做的是测试另一个字符串中是否存在一个字符串。

lines = ['this is a line without any keywords', 
         'this is a line with one', 
         'this is a line with one and two',
         'this is a line with three']
keywords = ['one', 'two', 'three']

for line in lines:
    for word in keywords:
        if word in line:
            print(line)
            break

The break当第一个单词匹配时,有必要打破“单词”循环。否则它将打印它匹配的每个单词的行。


正则表达式解决方案也有同样的问题。您可以使用与上面相同的解决方案,并在单词上添加一个额外的循环,或者您可以构建一个将自动匹配任何单词的正则表达式。请参阅Python 正则表达式语法 https://docs.python.org/3.4/library/re.html文档。

for line in lines:
    matches = re.findall('one|two|three', line)
    if matches:
        print(line, len(matches))            

注意re.findall如果没有匹配项,则返回一个空列表;如果有匹配项,则返回所有匹配项的列表。因此我们可以直接在 if 条件下测试结果,因为空列表的计算结果为False.

您还可以轻松生成这些简单情况的正则表达式模式:

pattern = '|'.join(keywords)
print(pattern)
# 'one|two|three'

要对它们进行排序,您只需将它们放入元组列表中并使用key的论证sorted.

results = []
for line in lines:
    matches = re.findall('one|two|three', line)
    if matches:
        results.append((line, len(matches)))

results = sorted(results, key=lambda x: x[1], reverse=True)

您可以阅读文档 https://docs.python.org/3.4/library/functions.html#sorted for sorted,但是keyargument 提供了一个用于排序的函数。在本例中,我们提取每个元组的第二个元素,这是我们存储该行中匹配项数量的位置,并用它对列表进行排序。


您可以通过这种方式将其应用到实际文件并保存结果。

keywords = ['one', 'two', 'three']
pattern = '|'.join(keywords)

results = []
with open('myfile.txt', 'r') as f:
    for line in f:
        matches = re.findall(pattern, line)
        if matches:
            results.append((line, len(matches)))

results = sorted(results, key=lambda x: x[1], reverse=True)

with open('results.txt', 'w') as f:
    for line, num_matches in results:
        f.write('{}  {}\n'.format(num_matches, line))

您可以阅读与上下文管理器 https://docs.python.org/3.4/reference/compound_stmts.html#the-with-statement,但在这种情况下,它基本上确保您在完成文件后将其关闭。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Python 在文件行中搜索列表条目 的相关文章

随机推荐

  • 使用 spring-hateoas 使用基于 HAL 的 REST 服务

    我正在尝试使用 RestTemplate 类使用基于 HAL 的 REST 服务 响应正文如下所示 embedded school teachers name Adams state CA links self href http loca
  • 如何在 android 或 ios 移动设备上运行 Nodejs 运行时

    我正在尝试使用 Ionic Framework 为 iOS android 开发一款 chrome cast 应用程序 为此我在应用程序中需要很少的 NodeJS 包 它可以在我的桌面上运行 但我不确定它将如何在没有可用的 Node 运行时
  • Heroku Rails Rake 任务同步生产和本地数据库

    我正在尝试创建一个 rake 任务 以便我只需键入 rake db sync 即可更新我的本地数据库以匹配生产 该解决方案利用 Heroku 团队提供的代码 使用 PG 备份导入和导出 Heroku Postgres 数据库 https d
  • 查找包含集合中所有值的最短连续子数组的算法

    我有以下问题需要解决 给定一组整数 例如 1 3 2 以及随机整数数组 例如 1 2 2 5 4 0 1 1 2 2 0 3 3 找到包含集合中所有值的最短连续子数组 如果找不到子数组 则返回空数组 Result 1 2 2 0 3 Or
  • 获取Android上所有应用程序的运行时间

    嗨 我正在开发一个应用程序 我必须在其中获取running time设备上安装的所有应用程序 那么 是否可以知道别人的应用程序在手机上运行了多长时间呢 例如 gmail 应用程序在手机上运行了多长时间 有没有API为此 或者我们必须开发自己
  • 为什么 JMX 报告的 JVM 堆使用最大值会随时间变化?

    我的一个 hadoop 集群的名称节点上的 JVM 堆最大值配置为 8GB 当我使用 JMX 监控 JVM 时 报告的最大值不断波动 如附图所示 http highlycaffeinated com assets images heapma
  • Python 可以识别交互运行的文件的更改吗?

    我正在做一些故障排除 我很好奇是否可以交互地运行 Python 脚本 更改脚本中定义的函数 保存文件 然后让交互式 shell 识别更改 这是我目前正在做的一个例子 my script py def dummy func print Som
  • 使用 @parameters 的 T-SQL 动态分组

    我想实现 SELECT param1 param2 param3 t field1 sum t amount FROM table t WHERE t field 2 IS NOT NULL AND t field3ID 12345 GRO
  • scipy PchipInterpolator 实现问题

    我正在尝试基于链接实现 PchipInterpolator http docs scipy org doc scipy 0 14 0 reference generated scipy interpolate PchipInterpolat
  • pdf.js 与本地 pdf 文件

    我正在尝试 pdf js 库 只想在我的服务器上显示本地 pdf 文件 而不是示例提供的 pdf 文件
  • 带有构建优化器的 AOT 和 JIT

    我正在关注解决方案here https github com Alekcei AotAndJit使用的JitCompilerFactory加载运行时编译器和自定义装饰器以保留组件和模块元数据 但是有了 Angular cli build o
  • golang中如何通过引用传递结构体类型的接口?

    我需要通过引用传递结构类型的接口 如下所示 由于我不能使用接口指针来构造类型变量 我应该如何更改以下代码来修改te价值10 package main import fmt func another te interface te check
  • 获取使用 Chart.js 渲染的折线图 y 轴的最大值

    我使用 Chart js 渲染分散折线图 效果非常好 对于渲染算法 我需要找出 y 轴上显示的最高值 因此假设数据集中的 最大 点为 y 248 因此 y 轴显示 250 作为最大值 我需要知道它是250 我尝试在运行时检查图表对象 如下所
  • Material UI 主题覆盖:如何全局覆盖子样式?

    我正在构建一个应用程序材质UI库 https material ui com 对于 ReactJS 使用主题覆盖 API https material ui com customization overrides global theme
  • MongoDB C# 2.0 超时异常

    我们最近将 Web 应用程序升级到 MongoDB C Driver 2 0 并部署到生产环境 在一定负载以下 应用程序运行良好 一旦生产服务器上的负载超过一定限制 应用程序的CPU立即降至0 大约30秒后 该异常会被记录多次 System
  • 轮播图像未填充 bootstrap 3 中的宽度

    我对这种响应式的东西太陌生了 我正在尝试使用新 bootstrap 3 中的轮播 但由于某种原因 图像没有填充轮播的宽度 所有图像的尺寸完全相同 1000x395 无论我做什么 它都不会完全填满 非常感谢任何和所有的帮助 这是我正在使用的代
  • 获取当前的 jQuery 选择器字符串?

    调用自定义插件时 如何获取当前选择器字符串 my selector p my plugin 想要输出my selector p在我的脚本中 我怎样才能访问这个字符串 您可以使用selector https api jquery com se
  • Kubernetes客户子域动态绑定

    我有以下用例 我们的客户经常在其 K8s 集群上发布新服务 这些新服务可以通过负载平衡和 Ingress 从外部访问 以便在部署服务后动态配置此负载平衡 这对于我们客户的开发团队来说非常容易 因为他们不必等到有人手动配置负载平衡 他们只需在
  • 点之间的角度?

    我有一个三角形 A B C 我试图找到每对三个点之间的角度 问题是我可以在网上找到的算法是用于确定向量之间的角度 使用向量 我可以计算从 0 0 到我所拥有的点的向量之间的角度 但这并不能给出三角形内的角度 好的 这是在维基百科页面上的方法
  • 使用 Python 在文件行中搜索列表条目

    我有一个包含数万行 ASCII 文本的文本文件 我有一个包含数百个要搜索的关键字的列表 单独考虑每一行 最初 如果有任何匹配项 我想返回 打印到屏幕或文件 该行 但最终我想根据匹配数对返回的行进行排名或排序 所以 我的清单是这样的 keyw