【问题标题】:Python: Read a file until a line matches a string in binary modePython:读取文件,直到一行与二进制模式下的字符串匹配
【发布时间】:2012-07-20 18:56:48
【问题描述】:

好的,所以我已经看到了其他问题,但我遇到了一个独特的问题。我必须以二进制模式打开文件才能读取它(我不太明白为什么,但它可以工作)。我可以轻松地打印出文件的行没问题。但是当我尝试使用re.search 查找特定行时,我遇到了问题,因为我有一个字符串模式和字节对象。这是我目前所拥有的:

input_file = open(input_file_path,  'rb',  0)

for line in input_file:
    if re.search("enum " + enum_name,  line, 0):
        print("Found it")
        print(line)
        exit()

enum_name 是用户输入,所以我真的需要知道如何在搜索以二进制模式打开的文件时同时使用字符串和变量(或者如何以非二进制模式打开此文件,我明白了'不处于二进制模式时没有无缓冲文本 I/O 错误)。我已经尝试为搜索二进制文件制作我的模式,但是当我这样做时我不知道如何处理该变量。

【问题讨论】:

  • 一个更好的问题可能是你为什么不能以文本模式打开文件
  • 标记为python-3.x,因为您提到了一个字节对象。
  • 在windows中,是否读取二进制文件是不同的(如果不是,windows行尾被替换为\n)

标签: python python-3.x


【解决方案1】:

您需要在您的正则表达式中使用字节字符串作为模式,如下所示应该可以:

if re.search(b"enum " + enum_name.encode('utf-8'), line):
    ...

这里的enum_name.encode('utf-8') 用于将用户输入转换为bytes 对象,根据您的环境,您可能需要使用不同的编码。

请注意,如果您的正则表达式真的这么简单,那么您可以只使用子字符串搜索来代替。

【讨论】:

  • 这个!!!我今天早些时候看到了类似的东西,但是当我遇到问题时我再也找不到它了。这很完美。
【解决方案2】:

你不需要重新。试试

if "enum " + enum_name in line:

使用“b”阅读主要是关于行尾。

【讨论】:

  • 基于问题的上下文,我很确定 OP 使用的是 Python 3.x,这意味着在二进制模式下读取时存在更大的差异。
猜你喜欢
  • 2018-10-23
  • 1970-01-01
  • 2012-09-05
  • 2019-11-02
  • 2021-11-09
  • 2020-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多