【问题标题】:Encoding text to file / reading encoded text correctly to eradicate the  symbol?将文本编码到文件/正确读取编码文本以消除符号?
【发布时间】:2013-10-17 12:41:20
【问题描述】:

基本上在我的学生数据中,我遇到了一个问题,如您所见,我的数据中出现了奇怪的 sumbols:MAIN £1.00when 它应该显示MAIN £1.00

下面是我的代码的 sn-p,它从网站上抓取某些学生信息以获得学生折扣,并最终将其写入文件。

# -*- coding: utf-8 -*-             
totals = main.find_all('p')
for total in totals:
    if total .find(text=re.compile("Main:")):
        total = total.get_text()
        if u"Main £" in total:
            pull1 = re.search(r'(MAIN) (\D\w+\D\d+)', total)
            pull2 = re.search(r'(MAINER) (\D\w+\D\d+)', total)
            if pull1:
                rpr_data.append(pull1.group(0).title())
                print pull1.group(0).title()
            if pull2:
                rpr_data.append(pull2.group(0).title())
                print pull2.group(0).title()
with open('RPR.txt','w') as rpr_file:
    rpr_file.write('\n'.join(rpr_data).encode("UTF-8"))

当我尝试在脚本 Matching three variables from textfile to csv and writing variables to the csv on matched rows 中重新使用此数据时,即使文本文件中的数据在写入 CSV 时没有奇怪的 Â 符号,符号又回来了...

我怎样才能正确地永久消除这个Â 符号?

【问题讨论】:

  • 首先,您确定脚本实际上保存为 UTF-8 文本文件,而不是 Latin-1/cp1252/etc。 (只是在顶部放一个编码声明注释并不会改变你的文本编辑器使用的编码,除了 emacs,它只是对 Python 说谎……)
  • 另外,您在哪里看到MAIN £1.00?打开RPR.txt后在Notepad.exe中?还是……?
  • @abarnert 我在某些印刷品上看到了这一点。使用行total = total.get_text() 以某种方式剥离Â 符号,但在另一个线程中运行匹配脚本后,我得到Â 重新出现在列中
  • 啊,那是因为你的终端的字符集是 Latin-1/cp1252/etc.,而 Python 正在打印 UTF-8。 (能否告诉我们您使用的是什么平台,如果不是 Windows,您使用的是什么终端,所以我不必一直猜测?)

标签: python csv python-2.7 utf-8 encode


【解决方案1】:

在各种西欧字符之前出现额外的Â 字符几乎总是将UTF-8 解释为Latin-1(或cp1252 或其他一些“扩展Latin-1”字符集)的标志。*

这可能是您接收 UTF-8 输入并尝试将其处理为 Latin-1,或者您生成 UTF-8 输出,而 else 正在尝试将其处理为 Latin-1。 p>


如果您在输出文件中看到这些,最有可能的是您的代码在每一步都做对了所有事情,并生成了一个完美的 UTF-8 文件……然后您尝试查看该文件在默认为 OEM 代码页的记事本等程序中的 OEM 代码页为 1252 的 Windows 机器上。

如果是这样,有两种可能:

  1. 不要那样做。以 UTF-8 格式查看文件。您可以告诉记事本以 UTF-8 格式而不是默认格式打开文件。或者您可以使用其他编辑器/查看器。

  2. 如果您希望文件以 cp1252 或“此机器上的任何 OEM 代码页”的形式显示,请以这种方式保存,例如,将最后一行更改为使用 encode("cp1252")。


如果您在 print 语句中看到它们,最有可能的是您的代码一切正常,但您的终端是 Windows DOS 提示符,再次设置为代码页 1252。请参阅 Python, Unicode, and the Windows console 和Windows cmd encoding change causes Python crash 了解这里可能出现的所有不同问题以及如何解决这些问题。


* 您可以从 Python 的快速行中看到这一点:u'\u00a3'.encode('utf-8').decode('latin-1') == u'\u00c2\u00a3'。 u'\u00c2' 是 Â。采用其他方式永远不会导致此问题:u'\u00a3'.encode('latin-1').decode('utf-8') 将改为引发UnicodeDecodeError。

【讨论】:

  • 原编码为:iso-8859-1
  • @Hyflex:什么的原始编码?源代码文件?一些你没有在这里展示给我们的输入文件?无论如何,iso-8859-1 和 Latin-1 是一样的。
  • 我的一些数据是从源中抓取的网站<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
  • Latin-1 确实如此。 >>> print "MAIN £1.00".decode('latin-1') -> MAIN £1.00
  • 使用以下行直接从 urllib 中提取数据:html = urllib2.urlopen("xx.xx.xxx.xx", timeout=10).read().decode('Latin-1')(无法显示网址,因为它是直接 IP)但如果我打印 html,它仍然显示奇怪一个
猜你喜欢
  • 1970-01-01
  • 2013-07-04
  • 1970-01-01
  • 2017-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-11
  • 2016-08-02
相关资源
最近更新 更多