<class 'str'>和<type 'str'>有什么区别?

19

我是Python的新手。我对 <class 'str'> 感到困惑。 我是通过以下方式获得字符串的:

response = urllib.request.urlopen(req).read().decode()

'response'的类型是<class 'str'>,而不是<type 'str'>。 当我尝试在'for loop'中操作这个字符串时:

for ID in response: 

“response”不是按行读取,而是按字符读取。我打算将每一行“response”放入一个列表的单独元素中。现在,我需要将响应写入文件,并使用“open”获取一个字符串类型为“<type 'str'>”,以便在“for循环”中使用。


1
你正在使用Python 2还是Python 3? - jwodder
response = urllib.request.urlopen(req)的翻译是:response = urllib.request.urlopen(req) - Ry-
Python 3。使用该库是可以的。 - dom free
3个回答

17
没有区别。在Python 2 (类型的表示方式为:<type 'int'>)和Python 3 (类型的表示方式为:<class 'int'>)之间,Python改变了type对象的文本表示方式。在Python 2和Python 3中,类型对象的类型都是type
>>> type(type('a'))
<type 'type'>

Python 3

>>> type(type('a'))
<class 'type'>

这就是改变的原因......字符串表示清楚地表明类型是一个类。

至于你问题的其余部分,

for ID in response:

response 是一个字符串,枚举它会给出字符串中的字符。根据响应的类型,您可能需要使用 HTML、JSON 或其他解析器将其转换为 Python 对象。


1
你说得对。这就是Python2和3之间的区别。感谢你的回答。 - dom free

13

正如评论者所提到的,在Python3中:

>>>st = 'Hello Stack!'
>>>type(st)
<class 'str'>

但在Python2中:

>>>st = 'Hello Stack!'
>>>type(st)
<type 'str'>

所以你看到的行为完全是符合预期的。 关于遍历字符串,对字符串进行for循环将逐个字符地迭代字符串。 如果你想遍历字符串中的每一行,通常会使用类似于在URL响应中拆分行分隔符的\n或某些正则表达式。下面是对从split结果列表的简单for循环。

response = urllib.request.urlopen(req).read().decode()
lines = response.split('\n')
for x in lines:
    st = x.strip()
    # do some processing on st

1
太棒了!我花了超过10个小时,在互联网上尝试了很多例子,都没用。这个完美地实现了列表的拆分和迭代。谢谢你! - Shankar Naru

4

如果你在Jupyter中遇到和我一样的困惑

使用type("hi")会给你str

而使用print(type('hi'))会给你<class 'str'> 无论如何,两者都是相同的!

enter image description here

#python3


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接