【问题标题】:Python not picking up UTF-8 encodingPython 没有采用 UTF-8 编码
【发布时间】:2020-11-23 12:59:28
【问题描述】:

我在将 ascii 字符编码为 UTF-8 时遇到了一些问题,或者一个字符串没有接受编码。

import unicodecsv as csv
import re
import pyodbc
import sys
import unicodedata
    
#!/usr/bin/python
# -*- coding: UTF-8 -*-
    
def remove_non_ascii_1(text):

    text.encode('utf-8')
    
    for i in text:

        return ''.join(i for i in text if i=='£')

在 Python 2.7 中出现错误

SyntaxError: Non-ASCII character '\xc2' in file on line 16, but no encoding declared; see SyntaxError: Non-ASCII character '\xc2' in file. 

使用 Unicode 替换

return ''.join(i for i in text if i=='\xc2')

错误是

UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal

示例文本:

读取 csv 文件中的行

[u'06/11/2020', u'ABC', u'32154E', u'3214', u'DEF', u'Cash Purchase', u'Final', u'', u'20.00%', u'ABC', u'Sold From Pickup', u'New ', u'10.00%', u'0', u'15%', u'\xa3469.84', u'Jonathan Jerome', u'3', u'\xa3140.95', u'2%', u'\xa393.97', u'\xa39,396.83', u'', u'\xa35,638.00', u'30/06/2020', u'4', u'Boiler-Amended']

我想删除货币字段中的 \xa3 或 £。

【问题讨论】:

  • 您可以添加包含问题的示例文本吗?
  • text.encode('utf-8') 在您的代码中什么都不做,您必须存储结果。
  • 您使用的是 Python 2.7 吗?如果是,你真的需要吗? Unicode 的管理一直是 Python 3 的一大改进...

标签: python python-2.7


【解决方案1】:

前面两件事:

  1. 由于提到的原因here!
  2. 不再使用 Python 2
  3. 不要在 Python 2 中使用不同的编码。
    TL;DR Python 3 改进了很多关于编码的东西,根本不值得。
    全文:阅读here

好吧,让我们开始修复你的代码吧。

正如Klaus D. 已经提到的,您不保存文本的结果。这会在比较紧密相等的字符(£和£)时导致编码警告,但一个以来自您读取的文件的编码进行编码,另一个以 ascii 编码(尽管您在-*- coding: UTF-8 -*-中编码您的代码。这只是以显示您的代码文件的编码内容,这不会改变解释器在 str-parsing 方面的行为)。
编辑:此外,在比较字符时,您需要比较一个 unicode 字符,因此您可以转换它,也可以简单地告诉解释器首先将其编码为 un​​icode(这就是为什么我在您的 '£'​​ 前面添加了一个前导 'u')

要解决此问题,只需在调用 text.encode('utf-8') 后再次将结果保存到 text

此外,“shebang”和编码信息应始终位于文件的最顶部,一旦您打开文件,您就知道自己在处理什么。

我要纠正的是第一个for-loop。这个是不必要的,因为在你处理完第一个元素之后,无论如何你都会返回这个函数。

这意味着完全“更正”的代码是这样的。

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import unicodecsv as csv
import re
import pyodbc
import sys
import unicodedata

def remove_non_ascii_1(text):
    text.encode('utf-8')
    return ''.join(i for i in text if i==u'£')

PS:你真的应该再想想def remove_non_ascii_1(text)是否真的有必要。从外观上看,您已经输入了您可能直接从文件中读取的 unicode 编码字符串列表。这意味着您不需要更正编码,尽管“£”的比较可能会保留。您可能只想重命名该方法;)

希望这有助于解决 Python 2 编码可能存在的不明确之处:D

如果您现在将列表作为一个整体打印,您将看到它仍然包含 \xca 而不是实际的 '£'​​ 但如果您单独打印元素,它工作正常。这是因为list的__str__()方法没有直接编码unicodes,而是使用标准的ascii编码...

【讨论】:

    【解决方案2】:

    Python 3 极大地改进了 unicode 文本处理。如果您必须使用 Python 2.7,我建议您在阅读文本文件时使用 codecs 库,因为它可以帮助您解决 Pyhton 2.7 unicode 问题:

    import codecs
    fp = codecs.open("file", "r"; encoding="utf-8")
    

    在您的情况下,我注意到您正在使用 unicodecsv 作为 csv 替代品。在这种情况下,您可以在将csv文件读入列表时传递参数encoding="utf-8"

    r = csv.reader(f, encoding='utf-8')
    

    对于仅删除非 Ascii 字符,我建议检查 this good answer on StackOverflow

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-14
      • 1970-01-01
      • 1970-01-01
      • 2021-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多