zttwm 发表于 2021-9-10 09:47:15

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 09:47:16

本帖最后由 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自带得记事本转码了,再去读就可以了)

tk3184020 发表于 2021-9-10 09:49:59

python 应该很少有这种编码问题了 = =
最简单先用记事本的另存为试一试

cct 发表于 2021-9-10 09:50:45

如果你这个全是单列的不如直接贴进excel去重就行了

cct 发表于 2021-9-10 10:06:07

本帖最后由 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:18:40

本帖最后由 傻眼貓咪 于 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)

zttwm 发表于 2021-9-10 11:30:11

tk3184020 发表于 2021-9-10 09:49
python 应该很少有这种编码问题了 = =
最简单先用记事本的另存为试一试

1.35GB直接无法打开

zttwm 发表于 2021-9-10 11:31:07

cct 发表于 2021-9-10 09:50
如果你这个全是单列的不如直接贴进excel去重就行了

粘贴板缓存16MB,总文件1.35GB

等等豆豆 发表于 2021-9-10 11:52:43

你的编码乱码是php的不是python的,你可以改一下项目整体的编码格式为utf-8

zttwm 发表于 2021-9-10 12:28:41

tk3184020 发表于 2021-9-10 09:56
刚才下载了文件看了一下。
这个txt是 宽字节小端编码utf16-le



请问如何判断 txt文件的编码?{:10_291:}感谢

hrpzcf 发表于 2021-9-10 12:40:57

本帖最后由 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:52:51

本帖最后由 阿奇_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的一种编码类型(写法)。

tk3184020 发表于 2021-9-13 09:50:47

zttwm 发表于 2021-9-10 12:28
请问如何判断 txt文件的编码?感谢

我用的就是最简单的,你用记事本打开,然后点菜单上面的另存为,另存为里面就有格式编码,那个下拉框里面显示的是什么就是什么编码了

tk3184020 发表于 2021-9-13 09:56:00

zttwm 发表于 2021-9-10 11:30
1.35GB直接无法打开

喔喔,那你就得读文件读出来他是什么格式了(一般文件头部都会有标识他是什么编码的文件的,先读几个字节,就能分辨他的编码类型了,然后再用相应的函数转码。或者有相应的函数,也能知道他编码格式的),具体读几个字节,去查查吧,每种文件的头部标识都不一样

python代码我就不懂了,不太擅长 希望能帮到你0.0
页: [1]
查看完整版本: python文本处理的编码问题求助,readline提示gbk之类的错误