在python中处理诸如pound之类的非科学字符

2024-06-01 08:29:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我想处理一个句子,比如: “这件礼物花了将近100英镑”

这个句子在一个文本文件中。我用python阅读,当我打印它时,我得到:

print "text",text
text The gift costs nearly £100.

我试图用代码替换它(当我完成处理后,我将使用另一个函数unmapstrangechars来获取原始数据):

^{pr2}$

但我确实有一个错误,说‘’不是acii字符。我怎样才能修好它?在

这将是有益的,至少知道我如何取代非acii字符与任何特定于这个字符,以便我可以恢复它的字母。 例如: 原稿:礼物花费将近100英镑。 复制品1:这件礼物价值11英镑1100英镑。 产出:这件礼物价值近100美元。在

实际输出是:

print text

整个代码(在txt文件中写着“礼物价值将近100英镑。”):

if 1==1:     
    import os
    script_dir = os.path.dirname(os.path.realpath(__file__))
    rel_path = "results/article.txt"
    abs_file_path = os.path.join(script_dir, rel_path)       
    thefile = open(abs_file_path)
    text = thefile.read()


    print "text",text


    def mapstrangechars(text):
        #text = text.replace("fdfdsfds","1pound1 ")
        return text

    def unmapstrangechars(text):
        #text = text.replace("1pound1 ","fdfdsfds")    
        return text  

    text = mapstrangechars(text)

    #process the text

    text = unmapstrangechars(text)    
    print "text",text  #this is output

Tags: path代码texttxtosdirscript字符
1条回答
网友
1楼 · 发布于 2024-06-01 08:29:59

这是因为文本文件的编码是“utf-8”,但您的终端/IDE可能是Windows-1252编码。在

在UTF-8中,磅符号被编码为两个字节:0xc2 0xa3 如果你在一个十六进制编辑器中打开你的文件,这就是你看到的。在

当您打印它时,您的终端/IDE将0xc2 0xa3解释为windows-1252。与其他8位代码页一样,windows-1252期望每个字节映射到一个字符。因此,当0xc2 0xa3被解释为windows-1252,并且每个字节被映射到一个字符时,会发生以下情况:

0xc2显示为Â
0xa3显示为£

解决方案是将文本文件解码为一种称为“Unicode string”的特殊Python字符串类型。一旦有了pythonunicode字符串,Python就可以为您的终端类型重新编码。一、 e,Python将解码UTF-8,然后编码为windows-1252。在

为此,请使用io模块open()方法并传入encoding属性:

import io
thefile = io.open(abs_file_path, encoding="utf-8")

当你从^{得到read(),你将得到一个<type 'unicode'>。它的功能和普通的字符串一样。当您将它传递给print时,Python将自动对其进行编码,以便在您的终端上显示。在

您不再需要mapstrangechars()和{}

注意:这是python2.x的特有特性,其中open()默认以二进制模式打开。Python3在默认情况下以文本模式打开,如果没有给出正确的编码,它将使用区域设置/语言设置来确定正确的编码。在

相关问题 更多 >