编写numpy字符串数组,同时编码并删除所有空格(Python)

2024-05-14 15:08:42 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我们有一个努比·恩达雷与纽比街python3中的元素。例如,arr下面是努比·恩达雷有四个纽比街像这样的元素:

>>> print(arr)
['\tSTART\t  0\n'  '12345 ABCDEFG'  '1A 2B3C'  '\nE N D'  '    C++    * 1']

我试图将arr的内容写入到一个文件中,不使用[]和不带每个numpy.str_元素的',同时删除所有空白,即制表符、换行符和所有空白字符。在

也就是说,我试图在这样的文件上写入arr

^{pr2}$

从我的previous question开始,如果我这样做的话

with open(resultfile, 'w') as f:
    f.write(''.join(tknstring).encode('unicode_escape'))

它删除了除空格字符外的所有内容,即:

START012345 ABCDEFG1A 2B3CE N D    C++    * 1

我知道,如果尝试以下操作,我可以删除所有空格字符:

''.join(tknstring.split())

我的问题是如何编写上面的语句来删除空格字符,同时连接元素并应用encode(如上所示)。在


Tags: 文件元素内容字符空白python3encodene
2条回答

连接完所有数组元素后,只需按任何空格字符拆分结果字符串,然后重新连接获得的数组:

''.join(''.join(tknstring).split()).encode('unicode_escape')

从您上一个问题(和我的答案)中的字符串数组开始:

arr = np.array(['\tSTART\t  0\n',  '12345 ABCDEFG',  '1A 2B3C',  '\nEN D'])

我们可以使用join将其转换为单个字符串(就像它是一个字符串列表一样):

^{pr2}$

使用regex我们可以轻松地将所有“空白”替换为空白:

In [1155]: import re
In [1156]: re.sub('\s','',astr)
Out[1156]: 'START012345ABCDEFG1A2B3CEND'

==========

带有[]和引号的显示只是显示数组的标准方式:

In [1157]: print(arr)
['\tSTART\t  0\n' '12345 ABCDEFG' '1A 2B3C' '\nE N D']

它与显示列表的标准方式略有不同(注意逗号):

In [1158]: print(arr.tolist())
['\tSTART\t  0\n', '12345 ABCDEFG', '1A 2B3C', '\nE N D']

您可能会发现显示str(arr)repr(arr)字符串很有启发性。每个Python对象都有一种将自身显示为字符串的方式。实际上有两种方式,str和{}。在

==========

unicode转义可以应用于“join”字符串,但看起来re.sub对此没有任何作用。我们必须研究re文档,看看是否有关于字节字符串的工作:

In [1164]: bstr=''.join(arr).encode('unicode_escape')
In [1165]: bstr
Out[1165]: b'\\tSTART\\t  0\\n12345 ABCDEFG1A 2B3C\\nE N D'
In [1166]: re.sub(b'\s',b'',bstr)
Out[1166]: b'\\tSTART\\t0\\n12345ABCDEFG1A2B3C\\nEND'

但是如果你在手之前去掉特殊字符,你可以在之后应用编码。在

In [1168]: re.sub('\s','',astr).encode('unicode_escape')
Out[1168]: b'START012345ABCDEFG1A2B3CEND'

re.sub也可以使用普通编码:

In [1177]: re.sub(b'\s',b'',astr.encode())
Out[1177]: b'START012345ABCDEFG1A2B3CEND'

=============

split()也起作用,因为默认拆分是“空白”(类似于re.split('\s+',astr))。所以这些变化起作用了:

encode并与b''连接:

In [1180]: b''.join(astr.encode().split())
Out[1180]: b'START012345ABCDEFG1A2B3CEND'

使用escapesplit不再识别这些特殊字符

In [1181]: b''.join(astr.encode('unicode_escape').split())
Out[1181]: b'\\tSTART\\t0\\n12345ABCDEFG1A2B3C\\nEND'

您也可以在删除空白后进行编码。您可以添加escape,但它现在没有任何用途。在

In [1183]: (''.join(astr.split())).encode()
Out[1183]: b'START012345ABCDEFG1A2B3CEND'

相关问题 更多 >

    热门问题