python 2.x 中的“编码是无效关键字”错误是不是不可避免?

Posted

技术标签:

【中文标题】python 2.x 中的“编码是无效关键字”错误是不是不可避免?【英文标题】:Is 'encoding is an invalid keyword' error inevitable in python 2.x?python 2.x 中的“编码是无效关键字”错误是否不可避免? 【发布时间】:2014-09-22 20:53:34 【问题描述】:

Ansi to UTF-8 using python causing error

我在那里尝试了将 ansi 转换为 utf-8 的答案。

import io

with io.open(file_path_ansi, encoding='latin-1', errors='ignore') as source:
    with open(file_path_utf8, mode='w', encoding='utf-8') as target:
        shutil.copyfileobj(source, target)

但我得到“TypeError: 'encoding' is an invalid keyword argument for this function”

我试过了

with io.open(file_path_ansi, encoding='cp1252', errors='ignore') as source:

,同样的错误。

然后我尝试了

import io

with io.open(file_path_ansi, encoding='latin-1', errors='ignore') as source:
    with io.open(file_path_utf8, mode='w', encoding='utf-8') as target:
        shutil.copyfileobj(source, target)

仍然出现同样的错误。我也尝试过使用 cp1252,但得到了同样的错误。

我从几个***问题中了解到

TypeError: 'encoding' is an invalid keyword argument for this function

在 python 2.x 中经常出现错误消息

但主要是回答者建议以某种方式使用 python 3。

在 python 2.x 中真的无法将 ansi txt 转换为 utf-8 txt 吗? (我用的是 2.7)

【问题讨论】:

我怀疑你在两次调用中都使用io.open() 时遇到了同样的错误。请将您的代码 sn-p 转换为完整的程序并重新运行。如果您仍然收到错误,请将整个程序(应该只有 7 行左右)和整个错误输出复制粘贴到您的问题中。 Ansi to UTF-8 using python causing error的可能重复 供参考:Pragmatic Unicode, or, How do I stop the pain? 在 Python 2 中使用 Python 3 构造不可避免地是一个错误,尽管有时没有明确的错误消息。在最坏的情况下,您的代码会运行,但会做错事。您需要了解 Python 2 和 Python 3 之间的区别,然后选择其中一个。 (今后,Py3 是推荐的选择。) 【参考方案1】:

这是在 Python 2 中将 ansi 转换为 utf-8 的方法(您只需使用普通文件对象):

with open(file_path_ansi, "r") as source:
    with open(file_path_utf8, "w") as target:
        target.write(source.read().decode("latin1").encode("utf8"))

【讨论】:

谢谢.. 但是这段代码和上面的代码有同样的问题。它破坏了非英文字符。我将 drive.google.com/file/d/0B1sEqo7wNB1-Mk5KZFM2SmxtbTA/... 转换为 drive.google.com/file/d/0B1sEqo7wNB1-RzE3VTc0SFhGR1U/... 如您所见,非英语已被破坏。这是因为它是 python 2.7 吗? 这是因为latin-1不支持非英文字符。 我测试了cp1252 而不是latin1,我得到了同样的错误。当我使用 notepad++ 打开 ansi txt 文件时,我正确地看到了那些非英文字符。所以我认为 Python 也可以阅读这些非英语的,即使它是 ansi。但是没有办法吗? 如果有非英文字符,那么你的文件不是 ansii(或 latin1)。 嗯.. 但是当我在记事本++中转到“编码”时,我看到“ANSI”被选中。【参考方案2】:

对于 Python2.7,在两个位置都使用 io.open()

import io
import shutil

with io.open('/etc/passwd', encoding='latin-1', errors='ignore') as source:
    with io.open('/tmp/goof', mode='w', encoding='utf-8') as target:
        shutil.copyfileobj(source, target)

上面的程序在我的电脑上运行没有错误。

【讨论】:

谢谢!也许我在尝试 io 时犯了一些错误。您的代码没有导致任何错误消息。但是一旦我在记事本++中打开输出,非英文字符都被破坏了。我检查了 latin-1 和 cp1252。 我把drive.google.com/file/d/0B1sEqo7wNB1-Mk5KZFM2SmxtbTA/…转给drive.google.com/file/d/0B1sEqo7wNB1-RzE3VTc0SFhGR1U/… 可以看到,非英文的已经断了。这是因为它是 python 2.7 吗? 对于仍然支持旧版本的任何人,open(以及io 模块的其余部分)的启用编码变体是introduced in Python 2.6。对于 2/3 代码兼容性,it's still in Python 3,它只是内置 open 函数的别名。【参考方案3】:

当我尝试将字节写入文件时,我遇到了同样的问题。 所以我的意思是,字节已经编码。因此,当您使用编码关键字时,这会导致错误。

【讨论】:

【参考方案4】:

TypeError: 'encoding' 是该函数的无效关键字参数

open('textfile.txt', encoding='utf-16')

使用io,2.7和3.6 python版本都可以使用

import io
io.open('textfile.txt', encoding='utf-16')

【讨论】:

以上是关于python 2.x 中的“编码是无效关键字”错误是不是不可避免?的主要内容,如果未能解决你的问题,请参考以下文章

Python 2.x 中的 nonlocal 关键字

Python 2.x 中的除法 [重复]

OpenCV 2.x 中的像素访问错误

Python 2.x闭包(enclosure)中的变量访问&修改

python 2.x中的中文

Python中出现request模块导入错误