【问题标题】:String not being found in line, but it's clearly there没有在行中找到字符串,但它显然在那里
【发布时间】:2017-07-03 13:51:18
【问题描述】:

我遇到了一个像这样的奇怪问题,我发现这是由于编码造成的。不幸的是,这个问题似乎更神秘。

我在一个文件中有如下所示的行:

�0�6�/�1�3�/�2�0�1�7� �0�9�:�5�0�:�4�8�.�1�3�3� �[�t�3�1�3�6�]� � �<�2�0�0�1�0�4�:�U�s�e�r�E�v�e�n�t�>� � �T�i�m�e�o�u�t� �h�a�s� �o�c�c�u�r�r�e�d�.�

我告诉python打开这个文件来读取行然后告诉我

for line in file: 
    if "Timeout has occurred." in line: 
        print(line)

它不工作。

我要搜索的字符串后面有一个空格,所以我也搜索了“发生超时。”但我不认为应该没关系。

我什至不知道从哪里开始。如果我以正确的编码打开文件,它应该可以正常工作。

【问题讨论】:

  • 能发一下代码吗?
  • 你能在检查前把它打印出来line吗?可能是它没有准确提取您期望的内容。
  • @JackParkinson 是的,它打印整行就好了,第二个我查找它不起作用的特定字符串。
  • @ChiaraL 我用来抓取文件行的​​代码是基本的(非常基本的 python i/o),它发布在原始问题中。没有比这更复杂的了。
  • 什么原始问题?

标签: python string search


【解决方案1】:

我创建了一个以 UTF-8 编码的文件(使用 Notepad++,使用 Encoding 菜单),并将这一行放在里面:

06/13/2017 09:50:48.133 [t3136]  <200104:UserEvent>  Timeout has occurred.

我运行了您在 pastebin 上发布的确切代码,并按预期打印了该行:

  [+] We're going to investigate Shell.log first to find evidence of an issue.
06/13/2017 09:50:48.133 [t3136]  <200104:UserEvent>  Timeout has occurred.
09
09:50:48.133...(trunc 25 chars)

在将第一个文件的编码设置为 ANSI 后,我运行相同的代码,但它仍然有效。 你描述的情况绝对没有问题。

现在可能是您的文件以某种花哨的编码进行编码,但我们不知道。 如果您使用的是 Notepad++,请尝试将您的文件转换为 UTF-8(Encoding>Convert to UTF-8),并查看文件是否更改。

【讨论】:

  • 在这一点上,我将不得不假设它与文件或读取方式有关。我得打印出ASCII什么的。
  • @DylanMoore 顺便说一句,您确定您的文件不包含花哨的字符吗?例如,西里尔字母中的相似字符会使比较失败。
  • 它使用像 UTF-16 这样的空点,但没有匹配的 BOM 条目...最糟糕的部分是我转换为他们的 ASCII,去掉空值,然后写入一个干净的文件......它仍然不起作用:(
【解决方案2】:

我使用了代码:

with open(filename) as file:
    for line in file:
        if "Timeout has occurred in line:
            print(line)

这适用于:

"06/13/2017 09:50:48.133 [t3136] <2000104:UserEvent> Timeout has occurred. "

我的纯文本文件正好有这个文本

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-29
    • 2021-01-06
    • 1970-01-01
    相关资源
    最近更新 更多