【问题标题】:How to ignore specific part of a text from a file and print the rest in python?如何忽略文件中文本的特定部分并在 python 中打印其余部分?
【发布时间】:2020-11-05 18:06:50
【问题描述】:

我是 python 的初学者,正在尝试编写一个脚本来忽略文本文件中的特定部分并打印该行的其余部分

输入文件:

ValueError: "invalid literal for int(12) with base", 10: This is an error in line 3

我试图用空格替换第一个冒号并忽略第二个冒号后面的文本,后跟一个数值

输出

ValueError  "invalid literal for int(12) with base"

我有一个使用字典的想法,但不知道如何实现它。如果方法更有效,请帮助我。任何帮助,将不胜感激。谢谢

【问题讨论】:

  • 我认为你应该关注字符串操作(搜索、拆分、拼接);也许是正则表达式。您可以举出更多的例子吗?
  • @sal 实际上,即使一行中有多个冒号,我也只是在数字后跟冒号时才尝试忽略文本。
  • 数字 10 是错误消息的重要部分,它表示输入不是有效的以 10 为基数的数字(即它不仅仅包含数字 0 到 9)。 Python 也可以做其他基础;例如,基数 16 是十六进制(0-9 和 A-F)。

标签: python python-3.x regex dictionary-comprehension


【解决方案1】:

没有正则表达式
使用split() 函数,将其拆分为冒号并仅连接前两个列表元素。然后用逗号分割它并返回第一个列表元素作为结果。

" ".join(('ValueError: "invalid literal for int(12) with base", 10: This is an error in line 3'.split(":"))[:-1])  

哪个会返回:

ValueError "invalid literal for int(12) with base", 10

然后可以再次拆分,返回第一个元素:

('ValueError "invalid literal for int(12) with base", 10'.split(","))[0]  

哪个会返回:

ValueError "invalid literal for int(12) with base"

总结一下:

error_string = 'ValueError: "invalid literal for int(12) with base", 10: This is an error in line 3'  
error_string = " ".join((error_string.split(":"))[:-1])   
error_string = (error_string.split(","))[0]  

或者如果你从文本文件中读取它:

with open("file1.txt", "r") as fi:
    lines = fi.readlines()
    for line in lines:
        error_string = line.rstrip()
        error_string = " ".join((error_string.split(":"))[:-1])
        error_string = (error_string.split(","))[0]
        # Do stuff here with the result
        print(error_string)

【讨论】:

  • 如果文本在某个 .txt 文件中有多行相同的文本,我们怎么写
  • 您可以逐行读取文本文件,然后处理每一行并将其存储在列表中,或者对结果执行任何您需要执行的操作。 with open("mytextfile.txt", "r") as fi: 然后lines = fi.readlines() 然后遍历for line in lines: 然后error_string = line.rstrip()
  • 它显示列表没有属性拆分。那么这意味着什么呢?
  • 我在答案中添加了一部分,显示您是否从文本文件中读取它。确保您的语法完全正确,因为我对其进行了测试并且它正在工作。
  • 感谢您的帮助。我现在明白了。
【解决方案2】:

使用正则表达式re.matchstr.join

例如:

import re

s = 'ValueError: "invalid literal for int(12) with base", 10: This is an error in line 3'
print(" ".join(re.match(r'([A-Za-z]+): (\".*?\")', s).groups()))

或者

m = re.match(r'([A-Za-z]+): (\".*?\")', s)
if m:
    print(" ".join(m.groups()))

输出:

ValueError "invalid literal for int(12) with base"

【讨论】:

  • 这将是要走的路。我个人只会匹配“ValueError”(如果需要,还有其他错误),因为文件有一行例如Some text here, a:b, then more text, and "quoted" string,那么输出Some text here, a "quoted"会有错误匹配。
【解决方案3】:

您可以使用字符串替换和正则表达式操作:

import re
text = 'ValueError: "invalid literal for int(12) with base", 10: This is an error in line 3'
text = text.replace(":", " ", 1)
re.sub(r",\s+\d+:.*$", "", text)

输出是:

'ValueError  "invalid literal for int(12) with base"'

【讨论】:

  • What's the reason for error say "object has no attribute replace" 。上面的代码正在运行,谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-01
  • 2010-10-31
  • 1970-01-01
  • 1970-01-01
  • 2020-03-17
  • 1970-01-01
相关资源
最近更新 更多