我正在做一个相当简单的代码,将欧洲葡萄牙语输入转换为巴西葡萄牙语-因此,有很多重音符号,例如á,é,À,ç等。
基本上,目标是从列表中查找文本中的单词,并将其替换为第二个列表中的BR单词。
代码如下:
#-*- coding: latin-1 -*-
listapt=["gestão","utilizador","telemóvel"]
listabr=["gerenciamento", "usuário", "celular"]
while True:
#this is all because I need to be able to input multiple lines of text, seems to be working fine
print ("Insert text")
lines = []
while True:
line = raw_input()
if line != "FIM":
lines.append(line)
else:
break
text = '\n'.join(lines)
for word in listapt:
if word in text:
num = listapt.index(word)
wordbr = listabr[num]
print(word + " --> " + wordbr) #just to show what changes were made
text = text.replace(word, wordbr)
print(text)
我使用IDLE在Windows上运行代码,并双击.py
文件。
使用IDLE时,该代码可以正常工作,但双击.py
文件时,则不能匹配和替换字符。
答案 0 :(得分:1)
我在这里看不到那个问题。
根据您对raw_input的使用,似乎您正在使用Python 2.x
这可能是因为我正在复制粘贴,以避免堆栈溢出,并且为您提供了不同的开发环境。
尝试在最新的Python 3解释器下运行脚本,并删除“#-*-encoding:”行。
这应该可以在您的代码中更快地解决UnicodeDecodeError问题,或者可以正常工作。
这里的问题是,Python 2.x在尝试在字节序列(Python 2.x字符串包含的内容,例如二进制文件内容)和有意义的文本(unicode,例如用于诸如用户信息显示汉字之类的东西),因为它对将人类可读文本如何编码为Python字符串中看到的字节序列做出了错误的假设。
这是Python 3试图解决更好/更少模棱两可的细节。
答案 1 :(得分:1)
这就是为什么代码在IDLE中能按预期工作,但不能从CMD或双击运行的原因:
解决此问题的方法是确保您正在比较“苹果与苹果”。您可以通过将所有内容转换为相同的编码来实现。例如。将读取的输入转换为UTF-8,使其与硬编码的字符串匹配。更好的解决方案是将所有[byte]字符串转换为Unicode字符串(无编码的字符串)。如果您使用的是Python 3,这将是全自动的。
在Python 2.x上,您需要做三件事:
用u
前缀所有源代码字符串,使其成为Unicode字符串:
listapt=[u"gestão",u"utilizador",u"telemóvel"]
listabr=[u"gerenciamento",u"usuário", u"celula]
...
if line != u"FIM":
或者,添加from __future__ import unicode_literals
以避免更改您的所有代码。
使用正确的编码标头来编码文件。我怀疑您的标题应该读为utf-8
。例如
#-*- coding: utf-8 -*-
将raw_input
的结果转换为Unicode。必须使用检测到的标准输入的编码来完成此操作:
import sys
line = raw_input().decode(sys.stdin.encoding)
顺便说一句,更好的方法是对单词列表进行建模以替换为字典来使用字典。键是原始单词,值是替换单词。例如
words = { u"telemóvel": u"celula"}
答案 2 :(得分:-1)
首先尝试执行下面的代码,它将解决此问题:
var p = await db.WatchedProducts.FirstOrDefaultAsync(u => u.ApplicationUserId == user.Id &&
u.ProductId == id)