我正在尝试使用 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 数据类型采用哪种拆分方法。
Split Method | Python2 Python | 3 |
---|---|---|
ASCII | str.splitlines | bytes.splitlines |
Unicode unicode.splitlines | str.splitlines |