鱼C论坛

 找回密码
 立即注册
查看: 2713|回复: 13

[已解决]python文本处理的编码问题求助,readline提示gbk之类的错误

[复制链接]
发表于 2021-9-10 09:47:15 | 显示全部楼层 |阅读模式
5鱼币
本帖最后由 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?m ... hlight=%B1%E0%C2%EB    试了一下,还是不行 ……然后就发帖求助了 ,求各路大神帮忙看看这个怎么办。 编码问题是个大问题吧。


说明一点:原文件大小1.35GB。。。。windows自带的txt直接无法打开
最佳答案
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自带得记事本转码了,再去读就可以了)

33333为原文件,out为readline处理后.rar

966 Bytes, 下载次数: 16

最佳答案

查看完整内容

刚才下载了文件看了一下。 这个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() (前提是 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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自带得记事本转码了,再去读就可以了)

另存为

另存为

前后运行结果

前后运行结果
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-9-10 09:49:59 | 显示全部楼层
python 应该很少有这种编码问题了 = =
最简单先用记事本的另存为试一试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-9-10 09:50:45 | 显示全部楼层
如果你这个全是单列的不如直接贴进excel去重就行了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-9-10 11:30:11 | 显示全部楼层
tk3184020 发表于 2021-9-10 09:49
python 应该很少有这种编码问题了 = =
最简单先用记事本的另存为试一试

1.35GB直接无法打开
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-9-10 11:31:07 | 显示全部楼层
cct 发表于 2021-9-10 09:50
如果你这个全是单列的不如直接贴进excel去重就行了

粘贴板缓存16MB,总文件1.35GB
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-9-10 11:52:43 | 显示全部楼层
你的编码乱码是php的不是python的,你可以改一下项目整体的编码格式为utf-8
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-9-10 12:28:41 | 显示全部楼层
tk3184020 发表于 2021-9-10 09:56
刚才下载了文件看了一下。
这个txt是 宽字节小端编码  utf16-le

请问如何判断 txt文件的编码?感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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[0] = lst[0][1:]
print(lst)

评分

参与人数 1鱼币 +2 收起 理由
zttwm + 2 大佬的答案很好,但是还是支持一下非会员。

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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的一种编码类型(写法)。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-9-13 09:50:47 | 显示全部楼层
zttwm 发表于 2021-9-10 12:28
请问如何判断 txt文件的编码?感谢

我用的就是最简单的,你用记事本打开,然后点菜单上面的另存为,另存为里面就有格式编码,那个下拉框里面显示的是什么就是什么编码了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-9-13 09:56:00 | 显示全部楼层
zttwm 发表于 2021-9-10 11:30
1.35GB直接无法打开

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

python代码我就不懂了,不太擅长 希望能帮到你0.0
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-13 10:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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