如何逐行打印在线TXT文件?解决代码输出字符而非行的问题
问题分析与解决方法
你遇到的问题很典型——当你使用.read().decode()获取整个文本内容后,得到的是一个完整的字符串,直接遍历这个字符串时,Python会默认逐个字符迭代,所以才会出现逐字符打印的结果。
下面给你两种可行的修改方案,根据你的需求选择即可:
方案一:分割字符串为行列表
如果文件体积不大,可以先把整个内容按换行符分割成每行的列表,再遍历打印:
import urllib.request, urllib.parse, urllib.error headers = {'User-Agent': '''Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36'''} url = 'https://www.py4e.com/code3/mbox.txt' req = urllib.request.Request(url, headers=headers) # 读取并解码为字符串后,按换行分割成行列表 fname = urllib.request.urlopen(req).read().decode() lines = fname.splitlines() for line in lines: print(line)
splitlines()方法会自动处理不同系统的换行符(\n、\r\n等),比直接用split('\n')更可靠。
方案二:逐行读取类文件对象(更高效)
urlopen()返回的响应对象是类文件对象,支持直接逐行迭代,不需要一次性加载全部内容,内存占用更低,适合大文件场景:
import urllib.request, urllib.parse, urllib.error headers = {'User-Agent': '''Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36'''} url = 'https://www.py4e.com/code3/mbox.txt' req = urllib.request.Request(url, headers=headers) # 使用with上下文管理自动关闭连接 with urllib.request.urlopen(req) as response: for line in response: # 每行是字节串,先解码为字符串,strip()去掉多余的换行符 print(line.decode().strip())
这里用with语句可以确保请求完成后自动关闭连接,避免资源泄漏;strip()是为了避免print自带的换行和文本本身的换行重复导致空行。
内容的提问来源于stack exchange,提问作者Jieyu Liu
相关产品推荐
相关产品推荐

