问答- 腾讯云开发者社区-腾讯云
文章推薦指數: 80 %
有没有一个解决方案可以接受任何已知的Python编码和输出为UTF-8而不需要BOM? ... fp = open('brh-m-157.json','rw') s = fp.read() u = s.decode('utf-8-sig') s ...
腾讯云备案控制台腾讯云开发者社区专栏问答沙龙团队主页TVP搜索搜索关闭创作写文章发视频提问登录注册展开腾讯云·社区登录首页专栏问答沙龙团队主页TVP返回腾讯云官网在Python中将带BOM的UTF-8转换为不带BOM的UTF-8浏览169关注0回答6得票数92原文这里有两个问题。
我有一组文件,它们通常是带有BOM的UTF-8。
我想把它们转换成没有BOM的UTF-8(最好是就地)。
看起来codecs.StreamRecoder(stream,encode,decode,Reader,Writer,errors)会处理这件事。
但我真的看不到任何关于用法的好例子。
这是处理这个问题的最好方法吗?sourcefiles:
TueJan17$filebrh-m-157.json
brh-m-157.json:UTF-8Unicode(withBOM)text复制此外,如果我们可以在不明确知道的情况下处理不同的输入编码(参见ASCII和UTF-16),那将是最理想的。
看起来这一切都应该是可行的。
有没有一个解决方案可以接受任何已知的Python编码和输出为UTF-8而不需要BOM?从下面编辑1个提议的解决方案(谢谢!)fp=open('brh-m-157.json','rw')
s=fp.read()
u=s.decode('utf-8-sig')
s=u.encode('utf-8')
printfp.encoding
fp.write(s)复制这会给我以下错误:IOError:[Errno9]Badfiledescriptor复制新闻快讯我在评论中被告知,错误是我以'rw‘模式打开文件,而不是'r+'/'r+b',所以我最终应该重新编辑我的问题并删除已解决的部分。
原文关注分享反馈tzot修改于2012-01-3105:156个回答高票数最新200_success修改于2018-07-1904:33已采纳得票数138只需使用"utf-8-sig"codecfp=open("file.txt")
s=fp.read()
u=s.decode("utf-8-sig")复制这将为您提供一个不带物料清单的unicode字符串。
然后,您可以使用s=u.encode("utf-8")复制将一个普通的UTF8编码的字符串返回到s。
如果你的文件很大,那么你应该避免将它们全部读入内存。
BOM在文件的开头只有三个字节,因此您可以使用以下代码将它们从文件中剥离出来:importos,sys,codecs
BUFSIZE=4096
BOMLEN=len(codecs.BOM_UTF8)
path=sys.argv[1]
withopen(path,"r+b")asfp:
chunk=fp.read(BUFSIZE)
ifchunk.startswith(codecs.BOM_UTF8):
i=0
chunk=chunk[BOMLEN:]
whilechunk:
fp.seek(i)
fp.write(chunk)
i+=len(chunk)
fp.seek(BOMLEN,os.SEEK_CUR)
chunk=fp.read(BUFSIZE)
fp.seek(-BOMLEN,os.SEEK_CUR)
fp.truncate()复制它打开文件,读取一个块,并将其写出到文件中,比读取它的位置早3个字节。
该文件将被就地重写。
因为更简单的解决方案是将较短的文件写入一个新文件,如newtover'sanswer。
这会更简单,但在短时间内使用两倍的磁盘空间。
至于猜测编码,那么您可以从最具体到最不具体依次遍历编码:defdecode(s):
forencodingin"utf-8-sig","utf-16":
try:
returns.decode(encoding)
exceptUnicodeDecodeError:
continue
returns.decode("latin-1")#willalwayswork复制UTF-16编码的文件不能解码为UTF-8,因此我们首先尝试使用UTF-8。
如果失败,那么我们尝试使用UTF-16。
最后,我们使用拉丁-1-这将始终有效,因为所有256个字节都是拉丁-1中的合法值。
在这种情况下,您可能希望返回None,因为它实际上是一种后备,并且您的代码可能希望更小心地处理这一点(如果可以)。
收藏0评论2分享反馈原文newtover回答于2012-01-1801:03得票数6importcodecs
importshutil
importsys
s=sys.stdin.read(3)
ifs!=codecs.BOM_UTF8:
sys.stdout.write(s)
shutil.copyfileobj(sys.stdin,sys.stdout)复制收藏0评论2分享反馈原文estevo回答于2014-05-1416:04得票数4这是我的实现,在没有BOM的情况下将任何类型的编码转换为UTF-8,并用通用格式替换windowsenline:defutf8_converter(file_path,universal_endline=True):
'''
ConvertanytypeoffiletoUTF-8withoutBOM
andusinguniversalendlinebydefault.
Parameters
----------
file_path:string,filepath.
universal_endline:boolean(True),
bydefaultconvertendlinestouniversalformat.
'''
#Fixfilepath
file_path=os.path.realpath(os.path.expanduser(file_path))
#Readfromfile
file_open=open(file_path)
raw=file_open.read()
file_open.close()
#Decode
raw=raw.decode(chardet.detect(raw)['encoding'])
#Removewindowsendline
ifuniversal_endline:
raw=raw.replace('\r\n','\n')
#EncodetoUTF-8
raw=raw.encode('utf8')
#RemoveBOM
ifraw.startswith(codecs.BOM_UTF8):
raw=raw.replace(codecs.BOM_UTF8,'',1)
#Writetofile
file_open=open(file_path,'w')
file_open.write(raw)
file_open.close()
return0复制收藏0评论0分享反馈原文doekman修改于2018-10-2215:27得票数3您可以使用编解码器。
importcodecs
withopen("test.txt",'r')asfilehandle:
content=filehandle.read()
ifcontent[:3]==codecs.BOM_UTF8:
content=content[3:]
printcontent.decode("utf-8")复制收藏0评论1分享反馈原文kqw修改于2015-10-3003:30得票数71在Python3中很简单:读取文件并使用utf-8编码重写它:s=open(bom_file,mode='r',encoding='utf-8-sig').read()
open(bom_file,mode='w',encoding='utf-8').write(s)复制收藏0评论0分享反馈原文AhmedAshour修改于2019-05-2818:45得票数4我发现这个问题是因为在使用UTF8BOM头打开文件时遇到了configparser.ConfigParser().read(fp)问题。
对于那些正在寻找解决方案来删除头文件以便ConfigPhaser可以打开配置文件而不是报告错误:Filecontainsnosectionheaders的人,请按如下方式打开该文件:configparser.ConfigParser().read(config_file_path,encoding="utf-8-sig")复制这可以使删除文件的BOM头文件变得不必要,从而节省大量的工作。
(我知道这听起来不相干,但希望这能帮助像我这样苦苦挣扎的人。
)收藏0评论1分享反馈原文页面原文内容由timpone、tzot、MartinGeisler、200_success、clement116、newtover、guneysus、estevo、wcc526、doekman、Max、GengJiawen、kqw、Alto.Clef、AhmedAshour、flipSTAR提供。
腾讯云小微IT领域专用引擎提供翻译支持原文链接:https://stackoverflow.com/questions/8898294复制广告关闭开发者专享福利,1988元优惠券限量发放带你体验博客、网盘相册搭建部署、视频渲染、模型训练及语音、文字识别等热门场景。
云服务器低至65元/年,GPU15元起立即抢购pythonutf-8utf-16byte-order-markPython中的元类是什么?得票数6483Python是否有一个三元条件运算符?得票数7063如何在Python中获取当前时间得票数3413将字节转换为字符串得票数3122如何在Python中连接两个列表?得票数3152Python是否有一个字符串'contains‘子字符串方法?得票数3593与编译的sdk版本24兼容的回收器视图库版本得票数0如何在Kotlin多平台Android测试中获取Android上下文?得票数2如何确定在netlogo中需要执行的运行次数,以减少随机化的影响?得票数1如何在WebView安卓系统中包含JavaScript得票数0社区专栏文章阅读清单互动问答技术沙龙技术视频团队主页腾讯云TI平台活动自媒体分享计划邀请作者入驻自荐上首页技术竞赛资源技术周刊社区标签开发者手册开发者实验室关于视频介绍社区规范免责声明联系我们友情链接归档问题归档专栏文章归档快讯文章归档关键词归档开发者手册归档开发者手册Section归档腾讯云开发者扫码关注腾讯云开发者领取腾讯云代金券热门产品域名注册云服务器区块链服务消息队列网络加速云数据库域名解析云存储视频直播热门推荐人脸识别腾讯会议企业云CDN加速视频通话图像分析MySQL数据库SSL证书语音识别更多推荐数据安全负载均衡短信文字识别云点播商标注册小程序开发网站监控数据迁移Copyright©2013-2022TencentCloud.AllRightsReserved.腾讯云版权所有京公网安备11010802017518粤B2-20090059-1扫描二维码扫码关注腾讯云开发者领取腾讯云代金券
延伸文章資訊
- 1Python中的字串操作和編碼Unicode詳解 - 程式前沿
Python在使用'utf-8'編碼寫入檔案時不會寫入BOM頭,但是如果指定編碼'utf-8-sig'則會迫使Python寫入一個BOM頭。 使用'utf-16-be'不會寫入一個BOM頭, ...
- 2问答- 腾讯云开发者社区-腾讯云
有没有一个解决方案可以接受任何已知的Python编码和输出为UTF-8而不需要BOM? ... fp = open('brh-m-157.json','rw') s = fp.read() u ...
- 3Python如何利用utf-8-sig编码格式解决写入csv文件乱码问题
这篇文章主要介绍了Python如何利用utf-8-sig编码格式解决写入csv文件乱码问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章 ...
- 4utf-8和utf-8-sig的区别 - 简书
前言:在写入csv文件中,出现了乱码的问题。 解决:utf-8改为utf-8-sig 区别如下: 1、”utf-8“ 是以字节为编码单元,它的字节顺序在所有系统中都是一样 ...
- 5What is the difference between utf-8 and utf-8-sig?
"sig" in "utf-8-sig" is the abbreviation of "signature" (i.e. signature utf-8 file). Using utf-8-...