QQ小鱼 发表于 2022-4-4 10:14:35

文件打开

def replace_file(file_name,new_line,b):
    f = open(file_name,'r+', encoding='utf-8')
    g = f.readlines()
    f.seek(0, 0)
    for i in g:
      i_new = i.replace(new_line,b)
      f.write(i_new)
    f.close()

def count_line(file_name,new_line):
    import re
    f = open(file_name, encoding='utf-8')
    g = f.readlines()
    f.seek(0,0)
    message = ''
    for line in g:
      message += line.rstrip()
    c = re.findall(new_line,message)
    count = len(c)
    return count

file_name = input('请输入文件名:')
new_line = input('请输入需要替换的文字:')
b = input('请输入新的文字:')
c = count_line(file_name,new_line)

print('文件%s中共有%s个%s'%(file_name,c,new_line))
print('您确定要把所有的%s都替换成%s:'%(new_line,b))
temp = input('(YES/NO):')
if temp == 'YES' or 'yes':
    replace_file(file_name,new_line,b)


报错:1、'utf-8' codec can't decode byte 0x87 in position 10: invalid start byte
          2、'gbk' codec can't decode byte 0xcf in position 53: illegal multibyte sequence

其实本来可以运行的,后面不知道咋的,就一直报错

wp231957 发表于 2022-4-4 10:26:46

狠古老的话题了,不是所有文件都是utf8也不是所有文件都是gbk,如果你用固定代码去批量处理一批文件10有89是不行的

jackz007 发表于 2022-4-4 10:45:36

       如果方便的话,把你要处理的文件发成附件。

isdkz 发表于 2022-4-4 10:51:05

编码不对的话会出错的,你的文件不一定编码就会统一,

所以用单一的编码是没法做到通用的,你可以用 cchardet 这个库先对编码进行检测,

故对你的代码修改如下(需要安装 cchardet,pip install cchardet):

file_name = input('请输入文件名:')

import cchardet
with open(file_name, 'rb') as f:
    encoding = cchardet.detect(f.read(1024))['encoding']

def replace_file(file_name,new_line,b):
    f = open(file_name,'r+', encoding=encoding)
    g = f.readlines()
    f.seek(0, 0)
    for i in g:
      i_new = i.replace(new_line,b)
      f.write(i_new)
    f.close()

def count_line(file_name,new_line):
    import re
    f = open(file_name, encoding=encoding)
    g = f.readlines()
    f.seek(0,0)
    message = ''
    for line in g:
      message += line.rstrip()
    c = re.findall(new_line,message)
    count = len(c)
    return count


new_line = input('请输入需要替换的文字:')
b = input('请输入新的文字:')
c = count_line(file_name,new_line)

print('文件%s中共有%s个%s'%(file_name,c,new_line))
print('您确定要把所有的%s都替换成%s:'%(new_line,b))
temp = input('(YES/NO):')
if temp == 'YES' or 'yes':
    replace_file(file_name,new_line,b)

ba21 发表于 2022-4-4 10:52:29

import cchardet as chardet

# 先检测出文件编码
with open("test.txt", "rb") as f:
    msg = f.read()

enc = chardet.detect(msg) # 返回的是个字典 编码和准确度。如:{'encoding': 'UTF-8', 'confidence': 0.9900000095367432}
print(enc)
enc = enc['encoding']

# 然后以指定编码打开文件
with open("test.txt", "r", encoding=enc) as f:
    print(f.read())

QQ小鱼 发表于 2022-4-4 15:54:43

isdkz 发表于 2022-4-4 10:51
编码不对的话会出错的,你的文件不一定编码就会统一,

所以用单一的编码是没法做到通用的,你可以用 cch ...

第一步:下载chardet-4.0.0.tar.gz
第二步:下载setuptools
前面两步,我都下载了后面我真的不知道怎么安装 chardet 模块了

isdkz 发表于 2022-4-4 15:55:34

QQ小鱼 发表于 2022-4-4 15:54
第一步:下载chardet-4.0.0.tar.gz
第二步:下载setuptools
前面两步,我都下载了后面我真的不知道怎么 ...

你直接用 pip 安装就可以了呀

QQ小鱼 发表于 2022-4-4 16:13:42

isdkz 发表于 2022-4-4 15:55
你直接用 pip 安装就可以了呀

还是不会,我已经下载了pip压缩包了,但是里面都是py文件,有一个setup.py文件,根本不知道咋办
{:5_107:}

isdkz 发表于 2022-4-4 16:17:04

QQ小鱼 发表于 2022-4-4 16:13
还是不会,我已经下载了pip压缩包了,但是里面都是py文件,有一个setup.py文件,根本不知道咋办
{:5_107 ...


执行这个:
python setup.py install

wp231957 发表于 2022-4-4 16:17:47

QQ小鱼 发表于 2022-4-4 15:54
第一步:下载chardet-4.0.0.tar.gz
第二步:下载setuptools
前面两步,我都下载了后面我真的不知道怎么 ...

直接pip不比这样简单
不会cmd都不会用?,

QQ小鱼 发表于 2022-4-4 16:21:17

isdkz 发表于 2022-4-4 16:17
执行这个:

我不是很懂,用那个执行这个指令,py文件不是都是黑一样就关闭了吗,那个setup.py也是,用编辑器打开吗?我是第一次下模板

isdkz 发表于 2022-4-4 16:23:10

QQ小鱼 发表于 2022-4-4 16:21
我不是很懂,用那个执行这个指令,py文件不是都是黑一样就关闭了吗,那个setup.py也是,用编辑器打开吗? ...

在地址栏(就是那个写着文件路径的地方)输 cmd,

然后在 cmd 执行那个命令

QQ小鱼 发表于 2022-4-4 16:41:24

isdkz 发表于 2022-4-4 16:23
在地址栏(就是那个写着文件路径的地方)输 cmd,

然后在 cmd 执行那个命令

一下午就证明我是个大聪明,输进去没有反应,我也不能发图片给你看,好难啊!估计pip也没安装好,那个模块也安装不了,烦死了

isdkz 发表于 2022-4-4 16:48:24

QQ小鱼 发表于 2022-4-4 16:41
一下午就证明我是个大聪明,输进去没有反应,我也不能发图片给你看,好难啊!估计pip也没安装好,那个模 ...

加我微信发图片吧,isdkz_
页: [1]
查看完整版本: 文件打开