我有一个字符串cb
(来自我无法控制的输入):
foo
bar
如果我将此字符串转换为列表:
>>> print(cb.splitlines())
['foo \t', '', ' bar']
我需要\t
,但不是空字符串,也不是前导(可能是尾随)空格。所以我稍微调整一下:
cb_formatted = list(filter(None, cb.splitlines()))
for l in cb_formatted:
l = l.strip()
但是:
>>> print(cb_formatted)
['foo \t', ' bar']
领先的空间仍在这里!所以也许那些不是空间......但它们是什么?
所以我这样做:
cb_formatted = list(filter(None, cb.splitlines()))
print(cb_formatted)
for l in cb_formatted:
l = l.strip()
for c in l:
print(c + "-" + ord(c))
但是:
Traceback (most recent call last):
File ".\foobar.py", line 61, in <module>
print(c + "-" + ord(c))
TypeError: must be str, not int
我试了ord(str(c))
而没有更多的运气。
如何找到这些字符是什么?
而且,或者,有没有比strip()
更好的方法来修剪它们?
答案 0 :(得分:3)
您无法连接字符串和整数对象。 ord(c)
返回一个整数(数字)。
尝试:
print(c + "-" + str(ord(c)))
此外,strip
接受一个参数,该参数是一个字符串,用于定义应该删除的所有字符:https://docs.python.org/2/library/string.html#string.strip
答案 1 :(得分:2)
最初的问题源于这种方法:
cb_formatted = list(filter(None, cb.splitlines()))
for l in cb_formatted:
l = l.strip()
您期望分配给l
来修改列表,但事实并非如此。它只是分配给一个变量l,它也已经从列表中分配了字符串,因为字符串不能被变异。此外,.strip()
还会删除制表符。我认为这应该产生你想要的行为:
cb_formatted = [line.strip(" ") for line in filter(None, cb.splitlines())]
答案 2 :(得分:0)
在行
for l in cb_formatted:
l = l.strip()
将已剥离元素的名称设置为用于循环中元素的名称(l
)。因此,在每次迭代时,最后一个被剥离的项目将丢失,并且循环l
将包含最后一个被剥离的项目。
此外,您根本没有更改列表本身。
对于其他错误,请参阅@ johk95的回答
答案 3 :(得分:0)
当您删除列表中的元素时,您将创建新字符串,但不会更改列表。
要获得所需的结果,请使用:
cb_formatted = [ l.strip(' ') for l in cb.splitlines() if l ]
答案 4 :(得分:0)
您可以对列表中的每个元素使用str.strip
来完成输出,并存储生成的新字符串。假设你有一个行列表:
>>> lines = ['foo \t', '', ' bar']
>>> [s.strip(' ') for s in lines if s]
['foo \t', 'bar']