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 文件或文本文件?