ChatGPT解决这个技术问题 Extra ChatGPT

Python 从文件中读取并保存到 utf-8

我在读取文件、处理其字符串并保存到 UTF-8 文件时遇到问题。

这是代码:

try:
    filehandle = open(filename,"r")
except:
    print("Could not open file " + filename)
    quit() 

text = filehandle.read()
filehandle.close()

然后我对变量文本进行一些处理。

接着

try:
    writer = open(output,"w")
except:
    print("Could not open file " + output)
    quit() 

#data = text.decode("iso 8859-15")    
#writer.write(data.encode("UTF-8"))
writer.write(text)
writer.close()

这完美地输出了文件,但根据我的编辑器,它在 iso 8859-15 中这样做。由于同一个编辑器将输入文件(在变量文件名中)识别为 UTF-8,我不知道为什么会发生这种情况。据我的研究表明,注释行应该可以解决问题。但是,当我使用这些行时,生成的文件主要在特殊字符中出现乱码,带有波浪号的单词作为文本是西班牙语。我真的很感激任何帮助,因为我很难过......

这是哪位编辑?哪个python版本?从这里开始,这段代码似乎是完全有效的,应该可以按预期工作……
凯特是编辑。 python --version 的输出是 Python 2.7.5+
我已经用 2.6.8、2.7.5+ 和 3.3.2+ 测试了您的代码,一切正常。你能提供一些示例输入吗?
由于文本是以原始字节处理的,因此看不见的处理代码可能会弄乱 UTF8 编码。
好的。我已经解决了。这主要是我的错,所以对不起大家。这就是发生的事情。如果我在打开文件时更改 iso-8859-15 而不是 utf-8,@MarkTolonen 提供的代码就可以工作。然而,当我的编辑器从内存中更新了已经加载旧编码的文件时,它向我展示了胡言乱语。当我再次打开文件时,它显示给我很好。谢谢大家,抱歉打扰了!!!

M
Mark Tolonen

使用带有 encoding 参数的 open 在程序的 I/O 边界处处理与 Unicode 往来的文本。确保使用正在读取的文件的(希望记录在案的)编码。默认编码因操作系统而异(具体而言,locale.getpreferredencoding(False) 是使用的编码),因此我建议始终明确使用 encoding 参数以实现可移植性和清晰性(以下 Python 3 语法):

with open(filename, 'r', encoding='utf8') as f:
    text = f.read()

# process Unicode text

with open(filename, 'w', encoding='utf8') as f:
    f.write(text)

如果仍在使用 Python 2 或为了兼容 Python 2/3,io 模块会使用与 Python 3 的 open 相同的语义实现 open,并且在两个版本中都存在:

import io
with io.open(filename, 'r', encoding='utf8') as f:
    text = f.read()

# process Unicode text

with io.open(filename, 'w', encoding='utf8') as f:
    f.write(text)

我完全按照你说的做了。与其他建议相同的错误
我已经开始工作了。问题是原始文件是 iso-8859-15
@aarelovich 您可能需要将 errors=ignoreerrors=replace 传递给 open() ...如果您不知道文件的编码。 :)
@arturomp 它也行不通。 io.open 要求写入 Unicode 字符串,而不是字节字符串。它对声明的编码进行编码。
@arturomp 更正,它不适用于 Python 3。Python 2 将使用默认的 ascii 编解码器将字节字符串隐式转换回 Unicode,因此只要字符串只是 ASCII 就可以工作。这就是 Python 3 改变它的原因......它防止了“它有时会工作”,这是一个令人讨厌的错误。
N
Noel Widmer

你也可以通过下面的代码来打通它:

file=open(completefilepath,'r',encoding='utf8',errors="ignore")
file.read()

F
Fernando Freitas Alves

你不能使用 open 来做到这一点。使用编解码器。

当您使用 open 内置函数在 python 中打开文件时,您将始终以 ascii 读取/写入文件。要用 utf-8 写它,试试这个:

import codecs
file = codecs.open('data.txt','w','utf-8')

试过这个,我得到了一个错误:UnicodeDecodeError: 'utf8' codec can't decode byte 0xe9 in position 57: invalid continuation byte
您是否使用 utf-8 编码保存?看,如果您正在从另一个 ascii 文件中读取,则必须先对其进行解码。
代码如您所见。我所做的是将行 writer = open(output,'w') 替换为 writer = codecs.open(output,'w','utf-8') ,这让我遇到了错误
J
Juan Carlos Orantes

编码参数就是诀窍。

my_list = ['1', '2', '3', '4']
with open('test.txt', 'w', encoding='utf8') as file:
    for i in my_list:
        file.write(i + '\n')