如何检查Python对象是否为字符串(常规或Unicode)?
当前回答
你可以通过连接一个空字符串来测试它:
def is_string(s):
try:
s += ''
except:
return False
return True
编辑:
更正我的回答后的评论指出,这失败与列表
def is_string(s):
return isinstance(s, basestring)
其他回答
isinstance(your_object, basestring)
如果对象确实是字符串类型,则为True。'str'是保留字。
我的道歉, 正确的答案是使用'basestring'而不是'str',以便它也包括unicode字符串-正如上面其他响应者之一所指出的那样。
Python 2和3
(cross-compatible)
如果你想检查不考虑Python版本(2。x vs . 3.x),使用six (PyPI)及其string_types属性:
import six
if isinstance(obj, six.string_types):
print('obj is a string!')
在六个(一个非常轻量级的单文件模块)中,它只是这样做的:
import sys
PY3 = sys.version_info[0] == 3
if PY3:
string_types = str
else:
string_types = basestring
if type(varA) == str or type(varB) == str:
print 'string involved'
从 EDX -在线课程 MITx: 6.00.1x使用Python的计算机科学和编程介绍
如果有人想远离显式类型检查(有很好的理由远离它),可能字符串协议中最安全的检查部分是:
str(maybe_string) == maybe_string
它不会遍历iterable或迭代器,它不会将字符串列表调用为字符串,它会正确地将类似字符串的对象检测为字符串。
当然也有缺点。例如,str(maybe_string)可能是一个繁重的计算。通常情况下,答案是视情况而定。
编辑:正如@Tcll在评论中指出的那样,这个问题实际上要求一种同时检测unicode字符串和字节字符串的方法。在Python 2上,这个答案将失败,对于包含非ascii字符的unicode字符串会出现异常,在Python 3上,它将对所有字节字符串返回False。
我认为可以安全地假设,如果repr()输出的最后一个字符是'或',那么无论它是什么,它都可以被认为是某种字符串。
def isStr(o):
return repr(o)[-1] in '\'"'
我假设repr不会做任何太繁重的事情,它会返回一个至少有一个字符的字符串。您可以使用类似的方法来支持空字符串
repr(o)[-1:].replace('"', "'") == "'"
但这仍然假设repr返回一个字符串。
推荐文章
- 将Pandas或Numpy Nan替换为None以用于MysqlDB
- 使用pandas对同一列进行多个聚合
- 使用Python解析HTML
- 如何分割逗号分隔的字符串?
- Java字符串—查看字符串是否只包含数字而不包含字母
- django MultiValueDictKeyError错误,我如何处理它
- 用javascript检查输入字符串中是否包含数字
- 如何在for循环期间修改列表条目?
- 我如何在Django中创建一个鼻涕虫?
- 没有名为'django.core.urlresolvers'的模块
- 蟒蛇导出环境文件
- Django - makemigrations -未检测到任何更改
- SQLAlchemy:引擎、连接和会话差异
- 在Python Pandas中删除多个列中的所有重复行
- 更改pandas DataFrame中的特定列名