1 题: Ansi到UTF-8使用python导致错误

在...创建的问题 Tue, May 23, 2017 12:00 AM

当我尝试编写一个将Ansi转换为UTF-8的python程序时,我发现了这个

https://stackoverflow.com/questions /14732996 /如何-可以-I-转换UTF-8到ANSI-在-蟒

将UTF-8转换为Ansi。

我认为通过颠倒顺序才会起作用。所以我编码了

 
file_path_ansi = "input.txt"
file_path_utf8 = "output.txt"

#open and encode the original content
file_source = open(file_path_ansi, mode='r', encoding='latin-1', errors='ignore')
file_content = file_source.read()
file_source.close

#write 
file_target = open(file_path_utf8, mode='w', encoding='utf-8')
file_target.write(file_content)
file_target.close

但它会导致错误。

 
TypeError: file<> takes at most 3 arguments <4 given>

所以我改变了

 
file_source = open(file_path_ansi, mode='r', encoding='latin-1', errors='ignore')

 
file_source = open(file_path_ansi, mode='r', encoding='latin-1')

然后它会导致另一个错误:

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

我应该如何修复我的代码来解决这个问题?

    
4
  1. 你需要使用 codecs.open
    2014-07-22 16:47:58Z
  2. @ dano:真的,io.open()更好,更强大,更不容易出错。
    2014-07-22 16:52:31Z
  3. 顺便说一句,术语ANSI实际上是一个完全用词不当,尽管它大量用于表示大致Windows 12位(或通常是437或850等)。 Latin-1是您实际使用的编码的名称;它主要与CP1251兼容(但反之亦然)。
    2014-07-22 17:06:20Z
  4. @ tripleee Latin 1不是CP1251,它是1252,甚至是近似值。
    2014-07-22 20:05:04Z
  5. 对,你是;对不起总是混淆这些(1251是西里尔语)。
    2014-07-22 20:15:07Z
  6. 醇>
    1答案                              1 跨度>                         

    您正在尝试使用Python 3版本的 open()函数,在Python 2上。在主要版本之间,对I /O支持进行了大修,支持更好的编码和解码。

    您可以在Python 2中获得与 io.open() 而不是。

    我会使用 shutil.copyfileobj()功能来执行复制,所以你不必将整个文件读入内存:

     
    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)
    

    但要小心;大多数人谈论ANSI是指 Windows代码页一个;您可能在CP(代码页)1252中确实有一个文件,它几乎是,但与 ISO-8859-1(Latin 1)。如果是这样,请使用cp1252而不是latin-1作为encoding参数。

        
    6
    2014-07-31 06:52:05Z
    1. CP1251是Cyrillic,它的CP1252与ISO 8859-1类似。
      2014-07-22 20:06:11Z
    2. @ KarolS:啊,是的,mea culpa。谢谢,纠正!
      2014-07-22 20:36:34Z
    3. @ MartijnPieters谢谢!但我怎么知道我的input.txt是用cp1252还是用拉丁语1编写的?
      2014-07-23 02:15:58Z
    4. @ user3123767:Latin-1的控制代码在80-9F范围内,而CP-1252在那里有更多字符(参见 CP-1252上的维基百科页面,查找表格行8_9_)。如果解码为cp1252的文本有效且有意义,那就去那里。很少有文本,如果any,无论如何都要使用Latin-1控制代码。
      2014-07-23 08:06:29Z
    5. @ MartijnPieters这段代码是否仅适用于python 3?我收到错误“编码是无效的关键字”。所以我用Google搜索了这个错误信息,然后我看到这个错误消息一旦在python 3上运行就消失了,而不是python 2.X
      2014-07-31 02:16:09Z
    6. 醇>
来源放置 这里