矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
查看: 683|回复: 14

Python代码文本文件readline读取一行为啥包括了BOM字节顺序标记?

[复制链接]
     
发表于 2024-12-19 20:07:29 | 显示全部楼层 |阅读模式
本帖最后由 ustone 于 2024-12-19 20:11 编辑

Python代码文本文件readline读取一行为啥包括了BOM字节顺序标记?
>>> f=open('d:/bar.txt','r',encoding='utf-8')
>>> f.readline()
'\ufeff新年都未有芳华,二月初惊见草芽。\n'
>>> f.readline()
'白雪却嫌春色晚,故穿庭树作飞花。'
>>>
     
发表于 2024-12-20 05:13:29 | 显示全部楼层
把 utf-8 改成 utf-8-sig 就可以了

  1. f = open('d:/bar.txt', 'r', encoding = 'utf-8-sig')
  2. print(f.readlines())
复制代码
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2024-12-20 08:02:48 | 显示全部楼层
scoopydoo 发表于 2024-12-20 05:13
把 utf-8 改成 utf-8-sig 就可以了

我要吐槽一下Python的文档,从open函数
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
第几段介绍encoding跳转到codecs,很长的一篇翻到最后才介绍:

encodings.utf_8_sig — UTF-8 codec with BOM signature

This module implements a variant of the UTF-8 codec. On encoding, a UTF-8 encoded BOM will be prepended to the UTF-8 encoded bytes. For the stateful encoder this is only done once (on the first write to the byte stream). On decoding, an optional UTF-8 encoded BOM at the start of the data will be skipped.

感觉文档太难用了,甚至比Qt的都不如。
回复 支持 反对

使用道具 举报

     
发表于 2024-12-20 08:13:42 | 显示全部楼层
ustone 发表于 2024-12-20 08:02
我要吐槽一下Python的文档,从open函数
open(file, mode='r', buffering=-1, encoding=None, errors=Non ...

文档的可读性固然重要,但更重要的是严谨可靠,一般情况下直接读文档对大多数人来说未必是最好的学习方式,否则也不会有那么多的书籍和教程了。

其实现在学习的最快最方便的途径是善用搜索引擎,最近 AI 也火了起来,但是偶尔会一本正经地胡说八道,还不可全信。

所谓的面向搜索引擎编程、面向 Stackoverflow 编程,其实是一种很好的学习方式。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2024-12-20 08:37:10 | 显示全部楼层
scoopydoo 发表于 2024-12-20 08:13
文档的可读性固然重要,但更重要的是严谨可靠,一般情况下直接读文档对大多数人来说未必是最好的学习方式 ...

入门学习我都是看书,查具体的函数用法才会看文档。
回复 支持 反对

使用道具 举报

     
发表于 2024-12-20 08:48:05 | 显示全部楼层
ustone 发表于 2024-12-20 08:37
入门学习我都是看书,查具体的函数用法才会看文档。

还是那句话,要善用搜索,其实 Stackoverflow 等网站上面几乎涵盖了初学者可能遇到的所有问题。
回复 支持 反对

使用道具 举报

     
发表于 2024-12-20 08:52:53 | 显示全部楼层
因为 utf-8-bom 在 linux 世界就是 \r\n 一样是个异类。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2024-12-20 08:56:16 | 显示全部楼层
scoopydoo 发表于 2024-12-20 08:48
还是那句话,要善用搜索,其实 Stackoverflow 等网站上面几乎涵盖了初学者可能遇到的所有问题。

文档是第一手的,Stackoverflow 确实也不错。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2024-12-20 08:59:14 | 显示全部楼层
junyee 发表于 2024-12-20 08:52
因为 utf-8-bom 在 linux 世界就是 \r\n 一样是个异类。

是个道理,不过函数应该自动判断处理。
回复 支持 反对

使用道具 举报

     
发表于 2024-12-20 09:12:39 | 显示全部楼层
ustone 发表于 2024-12-20 08:59
是个道理,不过函数应该自动判断处理。

如果自动处理了,就会有人说为啥不给机会让俺自己判断、处理 ......
回复 支持 反对

使用道具 举报

     
发表于 2024-12-20 09:14:53 | 显示全部楼层
ustone 发表于 2024-12-20 08:56
文档是第一手的,Stackoverflow 确实也不错。

没有人入门学习是看参考手册这类详尽严谨但是阅读吃力的文档。
回复 支持 反对

使用道具 举报

     
发表于 2024-12-20 14:38:37 | 显示全部楼层
本帖最后由 MF35_ 于 2024-12-20 14:40 编辑

编码格式的声明和转换是要手动处理的,所有的语言都是如此
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2024-12-20 16:02:42 | 显示全部楼层
scoopydoo 发表于 2024-12-20 09:12
如果自动处理了,就会有人说为啥不给机会让俺自己判断、处理 ......

如果对一系列文件open操作(for循环),encoding不一样,代码很难统一
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2024-12-20 16:03:36 | 显示全部楼层
scoopydoo 发表于 2024-12-20 09:14
没有人入门学习是看参考手册这类详尽严谨但是阅读吃力的文档。

没错      
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2024-12-20 16:04:42 | 显示全部楼层
MF35_ 发表于 2024-12-20 14:38
编码格式的声明和转换是要手动处理的,所有的语言都是如此

可能是吧  
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2025-4-29 21:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表