Python - 解析文件需要帮助。有没有办法忽略 EOF 字符?

Posted

技术标签:

【中文标题】Python - 解析文件需要帮助。有没有办法忽略 EOF 字符?【英文标题】:Python - Help needed with parsing file. Is there a way to ignore EOF chars? 【发布时间】:2016-05-03 18:11:14 【问题描述】:

我有一个二进制文件,我正在尝试从中提取字符串,而且我有很多时间这样做。 :(

我当前的策略是使用 Python 读取文件(使用以下函数之一:read()、readline() 或 readlines())。接下来,我逐行解析(逐个字符)并查找特殊字符 'ô',大多数情况下它直接跟随我想要的字符串!最后,我从记录所有我识别为“有效”的字符的特殊字符中向后解析。

在一天结束时,我想要前面的时间戳和该行中接下来的 3 个字符串。

结果:

在输入示例第 1 行中,“读取”函数不会读取整行(显示在输出图像中)。我相信这是因为该函数将二进制文件解释为 EOF 字符,然后停止读取。

在示例的第 2 行中,有时会出现“特殊字符”,但它不在我要提取的字符串之后。 :(

有没有更好的方法来解析这些数据?如果没有,有没有办法解决示例行 #1 中看到的问题?

当我将行打印为已读时输入数据和结果输出数据的示例。如您所见,使用readlines() 时,它不会读取整行

我的字符串提取算法,不是很健壮。

仅供参考,效率不一定重要。

【问题讨论】:

通过将您的代码发布为屏幕截图,您让我们更难为您提供帮助。 没有EOF字符这样的东西,EOF只是到达文件末尾的条件。 【参考方案1】:

为什么使用 Python。使用字符串并将其通过头部管道,例如

    strings /bin/ls | head -3

看看你会得到什么。您也可以获得 Windows 的字符串。

【讨论】:

这似乎是我正在寻找的。我为 windows 下载了 strings2 并试了一下,它似乎运行良好!这是输出: 41080, 1-Hello Comapany Here ?= Carpenter 202-Carpenter House Personxyz <br/> 401058, owner of area LLC company names 213-Ingledue East names 你可以,它只搞砸了 1 次。我认为我可以通过过滤一些我知道不会使用的字符来在 python 中清理这些东西。 感谢@Jorgen 的建议。 对不起,我是新手:/这似乎是我要找的。我为 windows 下载了 strings2 并试了一下,它似乎运行良好!这是输出:41080, 1-Hello Comapany Here ?= Carpenter 202-Carpenter House Personxyz 401058, owner of area LLC company names 213-Ingledue East names 你可以,它只搞砸了 1 次。我认为我可以通过过滤一些我知道不会使用的字符来在 python 中清理这些东西。感谢@Jorgen 的建议。【参考方案2】:

如果数据是二进制的,请勿将其读取为文本。将其作为二进制数据读取,然后尝试查找嵌入在二进制数据中的字符串。

with open("example.tp", "b") as f:
    data = f.read() # produces a bytes object in python 3

现在根据终端字符拆分数据

parts = data.split(b'\xf4') # f4 is hex code for your o character in latin-1

现在尽可能从每个部分中提取字符串:

from string import ascii_letters, digits

special_chars = '-()&, '
desired_chars = bytes(ascii_letters + digits + special_chars, encoding="ascii")

data = b'0,123\xf4NOPE#Hello world\xf4ignored' # sample data

parts = data.split(b'\xf4')

strings = []
for p in parts[:-1]: # ignore last part as it is never followed by the split char
    reversed_bytes = p[::-1]
    # extract the string
    for i, byte in enumerate(reversed_bytes):
        if byte not in desired_chars:
            chunk = reversed_bytes[:i]
            break
    else:
        chunk = reversed_bytes # all chars were valid
    bytes_ = chunk[::-1]
    bytes_ = bytes_.replace(b',', b'')
    strings.append(bytes_.decode("ascii")) # turn into a str
    # use ascii codec as there should be no non-ascii bytes in your string

print(strings) # prints ['0123', 'Hello world']

【讨论】:

以上是关于Python - 解析文件需要帮助。有没有办法忽略 EOF 字符?的主要内容,如果未能解决你的问题,请参考以下文章

GIt帮助文档之忽略某些文件——忽略python虚拟环境文件夹

我们有许多 EBCDIC 格式的大型机文件,Python 中有没有办法将大型机文件解析或转换为 csv 文件或文本文件?

Python:忽略文本文件的注释,该文本文件被解析为字典以写入 CSV [重复]

如何创建.gitignore文件,忽略不必要提交的文件

需要python lxml语法帮助来解析html

有没有办法忽略本地提供的网页的同源策略(文件:///)[重复]