canfeng0522 发表于 2023-4-30 18:17:35

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

我是需要导入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()

isdkz 发表于 2023-4-30 18:21:19

您好!从您的代码来看,可能的问题在于您在打开文件用于写入时没有指定编码。当您在循环中打开文件进行读取时,您指定了编码为'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() 。这样可以让代码更简洁,且避免了因忘记关闭文件而导致的潜在问题。

蓝屏爱好者 发表于 2023-4-30 18:22:40

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)

canfeng0522 发表于 2023-4-30 18:28:37

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

不行诶,还是报错,同样的错误

isdkz 发表于 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()

sfqxx 发表于 2023-4-30 18:39:19

歌者文明清理员 发表于 2023-4-30 18:47:48

鱼币

sfqxx_小 发表于 2023-4-30 18:55:55

{:10_257:}

Threebody1 发表于 2023-4-30 18:56:24

sfqxx_小 发表于 2023-4-30 18:55


我就换个号的功夫鱼币就没了{:10_266:}

sfqxx_小 发表于 2023-4-30 18:56:56

Threebody1 发表于 2023-4-30 18:56
我就换个号的功夫鱼币就没了

{:10_256:}

Threebody1 发表于 2023-4-30 18:58:04

sfqxx_小 发表于 2023-4-30 18:56


还我!{:10_265:}

sfqxx_小 发表于 2023-4-30 18:59:10

Threebody1 发表于 2023-4-30 18:58
还我!

给这个帖子评分:https://fishc.com.cn/thread-227678-1-1.html

Threebody1 发表于 2023-4-30 18:59:46

sfqxx_小 发表于 2023-4-30 18:59
给这个帖子评分:https://fishc.com.cn/thread-227678-1-1.html

我限额没了

sfqxx_小 发表于 2023-4-30 19:01:35

Threebody1 发表于 2023-4-30 18:59
我限额没了

行吧,明天记得给我

canfeng0522 发表于 2023-4-30 19:16:22

isdkz 发表于 2023-4-30 18:31
那可能就是你编码不对,跟有没有放在循环应该没有关系

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

gbk也报错,编码有问题。。。

陶远航 发表于 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()

sfqxx 发表于 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. 尝试改变原始数据的编码形式, 重新转换转换为正确编码后再进行处理

canfeng0522 发表于 2023-5-3 14:03:50

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

谢谢,改变原始文件的编码格式,后来重新打开就好了

sfqxx 发表于 2023-5-3 14:17:41

canfeng0522 发表于 2023-5-3 14:03
谢谢,改变原始文件的编码格式,后来重新打开就好了

不客气
页: [1]
查看完整版本: 为什么同样的一句话,添加了循环以后就报错呢?