鱼C论坛

 找回密码
 立即注册
查看: 2427|回复: 19

[已解决]为什么同样的一句话,添加了循环以后就报错呢?

[复制链接]
发表于 2023-4-30 18:17:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我是需要导入xml文件,然后打开,替换里面内容的,可是在Python的IDLE里面单独写打开文件这句话就不会报编码错误,而我编辑一个文本写在for循环里面却会报编码错误,请问这是为什么呀?
import re

for index_num in range(2755):
    f = open(f'{index_num}.xml','r',encoding='utf-8')
    content = f.read()
    new_str = re.findall('<filename>(.*)</filename>', content)
    old_str = ''.join(new_str)
    content = content.replace(old_str, f'{index_num}.jpg', 2)
    f.close()
    f = open(f'{index_num}.xml', 'w')
    f.write(content)
    f.close()
1.jpg
最佳答案
2023-5-3 11:41:28
该编码错误通常是在读取文本文件时出现的,有可能是因为文件内容包含了未知的字符或使用了和文件编码不匹配的编码方式。

在这段代码中,您使用了 utf-8 的编码打开xml文件。但是,考虑到该jupyter notebook还有其他的设置值,这些值可以影响到您的文件解释器的编码值。所以建议您对所用习惯的文本编辑器(如notepad++,atom等)查看文件的准确编码方式。此外,如果您的文件中包含非 unicode 字符,则会导致编码错误。可能需要采用其他编码格式(例如 gbk,gb2312)来打开特定文件。

针对类似情况,建议以下步骤:

1. 确认您的文件内容真正使用的编码格式。
2. 给 `open()` 函数增加 `errors='ignore'` 参数避免出现被忽略的错误文件。
   例如:`f = open(f'{index_num}.xml','r',encoding='utf-8', errors='ignore')`
3. 尝试改变原始数据的编码形式, 重新转换转换为正确编码后再进行处理
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-30 18:21:19 | 显示全部楼层

回帖奖励 +3 鱼币

您好!从您的代码来看,可能的问题在于您在打开文件用于写入时没有指定编码。当您在循环中打开文件进行读取时,您指定了编码为'utf-8',但在写入时并未指定编码。这可能会导致编码不一致,进而引发错误。您可以尝试在打开文件用于写入时也指定编码为'utf-8',如下所示:
import re

for index_num in range(2755):
    with open(f'{index_num}.xml', 'r', encoding='utf-8') as f:
        content = f.read()
        new_str = re.findall('<filename>(.*)</filename>', content)
        old_str = ''.join(new_str)
        content = content.replace(old_str, f'{index_num}.jpg', 2)

    with open(f'{index_num}.xml', 'w', encoding='utf-8') as f:
        f.write(content)

另外,我还将文件打开和关闭的操作优化为使用 with 语句。这样一来,当 with 块结束时,文件会自动关闭,无需手动调用 f.close() 。这样可以让代码更简洁,且避免了因忘记关闭文件而导致的潜在问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

发表于 2023-4-30 18:22:40 | 显示全部楼层

回帖奖励 +3 鱼币

import re

for index_num in range(2755):
    with open(f'{index_num}.xml', 'r', encoding='utf-8') as f:
        content = f.read()
        new_str = re.findall('<filename>(.*)</filename>', content)
        old_str = ''.join(new_str)
        content = content.replace(old_str, f'{index_num}.jpg', 2)
    with open(f'{index_num}.xml', 'w') as f:
        f.write(content)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

 楼主| 发表于 2023-4-30 18:28:37 | 显示全部楼层
isdkz 发表于 2023-4-30 18:21
您好!从您的代码来看,可能的问题在于您在打开文件用于写入时没有指定编码。当您在循环中打开文件进行读取 ...

不行诶,还是报错,同样的错误
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2023-4-30 18:31:37 | 显示全部楼层
canfeng0522 发表于 2023-4-30 18:28
不行诶,还是报错,同样的错误

那可能就是你编码不对,跟有没有放在循环应该没有关系

你可以把 'utf-8' 改成 'gbk’ 看看:
import re

for index_num in range(2755):
    f = open(f'{index_num}.xml','r',encoding='gbk')
    content = f.read()
    new_str = re.findall('<filename>(.*)</filename>', content)
    old_str = ''.join(new_str)
    content = content.replace(old_str, f'{index_num}.jpg', 2)
    f.close()
    f = open(f'{index_num}.xml', 'w')
    f.write(content)
    f.close()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-30 18:39:19 | 显示全部楼层

回帖奖励 +3 鱼币

点评

我很赞同!: 5.0
我很赞同!: 5
  发表于 2023-4-30 18:47
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-30 18:47:48 | 显示全部楼层

回帖奖励 +3 鱼币

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

使用道具 举报

发表于 2023-4-30 18:55:55 | 显示全部楼层

回帖奖励 +3 鱼币

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

使用道具 举报

发表于 2023-4-30 18:56:24 | 显示全部楼层

我就换个号的功夫鱼币就没了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-30 18:56:56 | 显示全部楼层
Threebody1 发表于 2023-4-30 18:56
我就换个号的功夫鱼币就没了

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

使用道具 举报

发表于 2023-4-30 18:58:04 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-30 18:59:10 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-30 18:59:46 | 显示全部楼层
sfqxx_小 发表于 2023-4-30 18:59
给这个帖子评分:https://fishc.com.cn/thread-227678-1-1.html

我限额没了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-30 19:01:35 | 显示全部楼层

行吧,明天记得给我

评分

参与人数 1荣誉 +4 贡献 +3 收起 理由
sfqxx + 4 + 3

查看全部评分

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

使用道具 举报

 楼主| 发表于 2023-4-30 19:16:22 From FishC Mobile | 显示全部楼层
isdkz 发表于 2023-4-30 18:31
那可能就是你编码不对,跟有没有放在循环应该没有关系

你可以把 'utf-8' 改成 'gbk’ 看看:

gbk也报错,编码有问题。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-1 09:19:16 | 显示全部楼层
可能是因为您在编辑文本时使用了不支持UTF-8编码的编辑器。在Python中打开文件时,如果您没有指定编码,则会默认使用操作系统的编码。但是,如果您使用不支持UTF-8编码的编辑器,那么在打开包含UTF-8编码的文件时,就会导致编码错误。

建议使用支持UTF-8编码的编辑器编辑您的代码文件和文本文件,以避免这种问题。
修改后的代码:
import re

for index_num in range(2755):
    f = open(f'{index_num}.xml', 'r', encoding='utf-8')
    content = f.read()
    new_str = re.findall('(.*)', content)
    old_str = ''.join(new_str)
    content = content.replace(old_str, f'{index_num}.jpg', 2)
    f.close()
    f = open(f'{index_num}.xml', 'w')
    f.write(content)
    f.close()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-3 11:41:28 | 显示全部楼层    本楼为最佳答案   
该编码错误通常是在读取文本文件时出现的,有可能是因为文件内容包含了未知的字符或使用了和文件编码不匹配的编码方式。

在这段代码中,您使用了 utf-8 的编码打开xml文件。但是,考虑到该jupyter notebook还有其他的设置值,这些值可以影响到您的文件解释器的编码值。所以建议您对所用习惯的文本编辑器(如notepad++,atom等)查看文件的准确编码方式。此外,如果您的文件中包含非 unicode 字符,则会导致编码错误。可能需要采用其他编码格式(例如 gbk,gb2312)来打开特定文件。

针对类似情况,建议以下步骤:

1. 确认您的文件内容真正使用的编码格式。
2. 给 `open()` 函数增加 `errors='ignore'` 参数避免出现被忽略的错误文件。
   例如:`f = open(f'{index_num}.xml','r',encoding='utf-8', errors='ignore')`
3. 尝试改变原始数据的编码形式, 重新转换转换为正确编码后再进行处理
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-3 14:03:50 | 显示全部楼层
sfqxx 发表于 2023-5-3 11:41
该编码错误通常是在读取文本文件时出现的,有可能是因为文件内容包含了未知的字符或使用了和文件编码不匹配 ...

谢谢,改变原始文件的编码格式,后来重新打开就好了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-3 14:17:41 | 显示全部楼层
canfeng0522 发表于 2023-5-3 14:03
谢谢,改变原始文件的编码格式,后来重新打开就好了

不客气
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-28 04:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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