为何从response.read()读取的‘行’是整数?Python文本下载解码问题
解决Python下载文本URL并逐行解码为字符串列表的问题
我懂你踩的这个坑——urllib.request.urlopen()返回的响应读出来是字节对象(bytes),直接遍历它会拿到每个字节的整数编码,而直接解码整个字节串后遍历又会拆成单个字符,确实容易搞混。下面给你几个实用的解决方案:
方法1:用readlines()逐行读取并解码
urlopen返回的响应对象本身支持readlines()方法,它会直接返回按行分割的字节列表,你只需要对每个元素解码就行:
def download_index(self, url): response = urllib.request.urlopen(url) list_of_strings = [] # 逐行读取字节,解码为字符串后加入列表 for line_bytes in response.readlines(): line_str = line_bytes.decode('utf-8').strip('\n') # 可选:去掉末尾换行符 list_of_strings.append(line_str) return list_of_strings
方法2:先整体解码再按行分割(最简洁)
如果文件体积不大,直接把整个字节串解码成字符串,再用splitlines()方法按行分割,一步到位:
def download_index(self, url): response = urllib.request.urlopen(url) data = response.read().decode('utf-8') # 先把字节整体解码为字符串 list_of_strings = data.splitlines() # 自动识别换行符分割行 return list_of_strings
splitlines()会自动兼容不同系统的换行符(\n、\r\n都能处理),非常省心。
方法3:用io.TextIOWrapper包装成文本流
这种方式更贴近处理本地文本文件的逻辑,把字节流包装成文本流,直接按行读取:
import io def download_index(self, url): response = urllib.request.urlopen(url) # 将字节响应包装为文本流,指定编码格式 text_stream = io.TextIOWrapper(response, encoding='utf-8') list_of_strings = [] for line in text_stream: list_of_strings.append(line.strip('\n')) # 可选去除换行符 return list_of_strings
为什么你的原代码会出问题?
- 直接遍历
data(bytes对象):bytes是字节的序列,遍历它会逐个取出每个字节的十进制整数(比如字符'a'对应的字节是97,就会拿到97),所以你看到的line是整数。 - 先解码整个
data再遍历:解码后得到的是字符串,遍历字符串默认是按单个字符迭代,所以会拿到每个字符而不是整行。
内容的提问来源于stack exchange,提问作者BabaSvoloch
相关产品推荐
相关产品推荐

