如何使 str.splitlines 方法不按十六进制字符分隔行?



我正在尝试使用 str.splitlines(( 解析 GNU 字符串实用程序的输出 以下是 GNU 字符串的原始输出:

279304 9k=pNn 279340 9k=PNn 279376 9k<LNn 279412 9k=x0cNn 279448 9k<4Nn

当我使用以下代码解析输出时:

process = subprocess.run(['strings', '-o', main_exe], check=True, 
stdout=subprocess.PIPE, universal_newlines=True)
output = process.stdout
print(output)
lines = output.splitlines()
for line in lines:
print(line)

我得到了一个我意想不到的结果,它破坏了我的进一步解析:

279304 9k=pN
279340 9k=PN
279376 9k<LN
279412 9k=
N
279448 9k<4N
279592 9k<hN
279628 9k;TN
279664 9k<$N

我可以以某种方式告诉分隔线((方法不会触发x0字符吗?

所需的结果应具有以偏移量开头的行(每行开头的 6 位数字(:

279304 9k=pN
279340 9k=PN
279376 9k<LN
279412 9k=N
279448 9k<4N
279592 9k<hN
279628 9k;TN
279664 9k<$N

我认为你实际上得到了预期的结果。但假设 ASCII 或其任何修订词(拉丁语-x、UTF8 等('x0c'是控制字符 FormFeed,它恰好在这里表示为垂直的一行跳转。

换句话说,我敢打赌,结果文件包含预期的字节,但您的进一步处理会阻塞控制字符。

str.splitlines()的文档说它将根据包括x0c在内的许多线边界类型分割线。如果只想显式拆分 ,则可以改为用户str.split('n')。但是请注意,如果您的行以 ' 结尾,那么您最终将得到一个空组,如果最后一个索引为空字符串,您可能希望删除该组。

data = '279304 9k=pNn 279340 9k=PNn 279376 9k<LNn 279412 9k=x0cNn 279448 9k<4Nn'
lines = data.split('n')
if lines[-1] == '':
lines.pop()
print(lines)
for line in lines:
print(line)

输出

['279304 9k=pN', ' 279340 9k=PN', ' 279376 9k<LN', ' 279412 9k=x0cN', ' 279448 9k<4N']
279304 9k=pN
279340 9k=PN
279376 9k<LN
279412 9k=N
279448 9k<4N
process = subprocess.run(['strings', '-o', main_exe], check=True, 
stdout=subprocess.PIPE, universal_newlines=True)
lines = [line.strip() for line in process.stdout.split('n') if len(line) > 0]

删除对strip()的调用,如果您确实希望在每行上保留前导空格

您的问题源于使用 Unicode 字符串的splitlines方法,该方法产生的结果与字节字符串的splitlines方法不同。

cpython 有一个问题,自 2014 年以来一直开放:。 在非\r字符上拆分str.splitlines - 问题 #66428 - python/cpython.

下面我添加了一个可移植的splitlines函数,该函数对Unicode和字节字符串使用传统的ASCII换行符,并在Python2和Python3下工作。还为效率爱好者提供了一个穷人的版本。

  • 在 Python 2 中,str类型是一个 8 位字符串,Unicode 字符串的类型是unicode
  • 在 Python 3 中,str类型是 Unicode 字符串,8 位字符串具有类型字节

虽然 Python 2 和 Python 3 Unicode和 8 位字符串之间的行拆分没有实际区别,但在 Python 3 下运行原版代码时,使用 Unicode 字符串的扩展通用换行符方法更有可能遇到麻烦。

下表显示了哪种 Python 数据类型采用哪种拆分方法。

Python
Split Method2 Python3
ASCIIstr.splitlinesbytes.splitlines
Unicode unicode.splitlinesstr.splitlines

最新更新