python文本处理的编码问题求助,readline提示gbk之类的错误
本帖最后由 zttwm 于 2021-9-10 11:29 编辑RT,有朋友给我发了个大文件,要去重,顺序无所谓,一看,这简单,open以后,readline,append到列表里各种set list一阵操作就行了,安排,试着跑一下,提示UnicodeDecodeError,好家伙,是因为含有火星文嘛?试着用utf-8报错,那ISO-8859-1,这个能用,但是出来的字符和原来的文本完全对不上!!!!那去掉,利用try和except检测UnicodeDecodeError跳过异常行总行了吧,结果还是乱码……看来全文都是火星级编码,论坛搜索,发现个处理编码的神器:https://fishc.com.cn/forum.php?mod=viewthread&tid=66086&highlight=%B1%E0%C2%EB 试了一下,还是不行{:10_285:} ……然后就发帖求助了{:10_245:} ,求各路大神帮忙看看这个怎么办。{:10_254:} 编码问题是个大问题吧。
说明一点:原文件大小1.35GB。。。。windows自带的txt直接无法打开 本帖最后由 tk3184020 于 2021-9-10 10:12 编辑
刚才下载了文件看了一下。
这个txt是 宽字节小端编码utf16-le
直接在记事本中另存为一个ANSI编码就可以了,确定的时候他会警告你丢失Unicode编码不用管他直接确定
再跑程序去读他就不会乱了
我只简单得读取了一下 没有进行你的需求
f = open('3333.txt','r')
line = f.readline()
while line:
#print(line + " " + line1)
print(line)
line = f.readline()
f.close()
(前提是你已经用Win自带得记事本转码了,再去读就可以了) python 应该很少有这种编码问题了 = =
最简单先用记事本的另存为试一试 如果你这个全是单列的不如直接贴进excel去重就行了 本帖最后由 cct 于 2021-9-10 10:07 编辑
import os
import codecs
def parseFile(filepath):
fp2 = codecs.open(filepath, 'r', 'utf-16-le')
lineList = fp2.readlines()
fp2.stream.close()
lineSet = set(map(lambda x: x.strip(), lineList))
with open(r'./out_fix.txt', 'w', encoding='utf-8') as f:
for i in lineSet:
f.write(i+"\n")
if __name__ == '__main__':
filepath = './3333.txt'
parseFile(filepath) 本帖最后由 傻眼貓咪 于 2021-9-10 11:22 编辑
LE 是 Little Endian 的縮寫, BE 是 Big Endian 的縮寫。為什麼不直接用 utf_16呢?
樓主用的是 utf_8 似乎不夠用呢
# 生成一個 Unicode 編碼的文件
import codecs
with codecs.open('a.txt', 'w', encoding='utf_16') as f:
f.write(u'a')utf_16 # 支援全部 unicode
utf_16_be #支援全部 unicode 但位元組順序(大端序)big-endian (BE)
utf_16_le #支援全部 unicode 但位元組順序(小端序)little-endian (LE) tk3184020 发表于 2021-9-10 09:49
python 应该很少有这种编码问题了 = =
最简单先用记事本的另存为试一试
1.35GB直接无法打开 cct 发表于 2021-9-10 09:50
如果你这个全是单列的不如直接贴进excel去重就行了
粘贴板缓存16MB,总文件1.35GB 你的编码乱码是php的不是python的,你可以改一下项目整体的编码格式为utf-8 tk3184020 发表于 2021-9-10 09:56
刚才下载了文件看了一下。
这个txt是 宽字节小端编码utf16-le
请问如何判断 txt文件的编码?{:10_291:}感谢 本帖最后由 hrpzcf 于 2021-9-10 12:47 编辑
利用 chardet 探测文件编码
12:47编辑:修个可能出现的 BUG
# coding: utf-8
from chardet import UniversalDetector
def detectfile(file_path):
"""
分段读取探测文件编码,适用于超大文件
:参数 file_path: 文本文件的路径
:类型 file_path: file_path 数据类型为 str
"""
detector = UniversalDetector()
handle = open(file_path, "rb")
while not detector.done:
content = handle.read(4096)
if not content:
break
detector.feed(content)
handle.close()
return detector.close()["encoding"]
# 以下为 detectfile 函数的用例
fp = r"C:\Users\hrpzcf\Desktop\33333为原文件,out为readline处理后\3333.txt"
with open(fp, "rt", encoding=detectfile(fp)) as ft:
lst = ft.readlines()
# print(lst)
# 但是读取到的内容开头会多一个 \ufeff,原因是你的文件是带 BOM的,把开头 \ufeff 去掉就行了
lst = lst
print(lst)
本帖最后由 阿奇_o 于 2021-9-10 12:54 编辑
只要编码正确(一致),with open() 就可以读取,几个G都行
with open("3333.txt", 'r', encoding="utf-16le") as f:
for line in f:
print(line.strip())
# 问题:对于一个"未知的、不能打开的"文件,我怎么知道它的encoding 呢?
# 答:参考Stack Overflow的答案,可以用Git的命令(其他办法自己去找):
$ file --mime-encoding * # 查看当前目录所有文件的mime编码类型
注:python open()的encoding用的也是 MIME的一种编码类型(写法)。
zttwm 发表于 2021-9-10 12:28
请问如何判断 txt文件的编码?感谢
我用的就是最简单的,你用记事本打开,然后点菜单上面的另存为,另存为里面就有格式编码,那个下拉框里面显示的是什么就是什么编码了 zttwm 发表于 2021-9-10 11:30
1.35GB直接无法打开
喔喔,那你就得读文件读出来他是什么格式了(一般文件头部都会有标识他是什么编码的文件的,先读几个字节,就能分辨他的编码类型了,然后再用相应的函数转码。或者有相应的函数,也能知道他编码格式的),具体读几个字节,去查查吧,每种文件的头部标识都不一样
python代码我就不懂了,不太擅长 希望能帮到你0.0
页:
[1]