urllib.request.urlopen与open处理CSV的差异及使用疑问
urllib.request.urlopen读取本地文件而非open? 结合你后续用chardet.detect检测编码的操作,确实能找到当时这么写的合理原因,分几点说明:
满足
chardet.detect的字节流需求:chardet.detect只能接收原始字节数据才能正确检测编码。如果直接用open(file)(默认文本模式),Python会自动用系统默认编码把文件内容解码成字符串,这时候再传给chardet.detect会直接报错。虽然open(file, 'rb').read()也能拿到字节流,但你选了urllib的方式,可能还有其他考量。统一本地/远程资源的读取逻辑:如果这段代码原本需要同时处理本地文件和网络URL(比如
http://开头的资源),用urllib.request.urlopen可以统一接口——不管是本地file://路径还是远程链接,都用同样的方法读取字节数据,不用写两套分支代码处理不同资源类型。跨平台路径兼容性:把本地路径转成
file://URL后,urllib会自动处理跨平台的路径分隔符问题(比如Windows下的\转成URL标准的/),对于包含特殊字符的路径(比如空格、非ASCII字符),urllib的解析逻辑可能比直接open更稳定。遗留的编码习惯:如果当时你刚写完大量网络请求相关代码,习惯了用
urllib的接口处理资源读取,可能顺手就把这个逻辑沿用在了本地文件上,虽然不是必须,但也能正常工作。
补充对比
其实open(file, 'rb').read()和urllib.request.urlopen('file://' + file).read()都能生成chardet.detect需要的字节数据,功能上是等价的。你当时选择urllib,大概率是为了统一资源处理逻辑或者规避某些路径相关的坑。
内容的提问来源于stack exchange,提问作者Abpostman1

