【问题标题】:Python UnicodeDecodeError exceptionPython UnicodeDecodeError 异常
【发布时间】:2016-04-25 13:55:45
【问题描述】:
txt = input("vilken textfil vill du använda?")
fil = open(txt,"r")

spelare=[]
resultat=[]
bästnamn=None
bästkast=0

for line in fil:

kolumn=line.split()
kolumn1=len(kolumn[1])
kolumn2=len(kolumn[2])
if len(kolumn)<5:
    mu=float(kolumn[1])
    sigma=float(kolumn[2])
    #print(mu,sigma)
    #kast=random.normalvariate(mu,sigma)
    #print(kast)

    for r in range(0,6):
        kast=random.normalvariate(mu,sigma)
        resultat.append(kast)

if max(resultat)>bästkast:
   bästkast=max(resultat)
   bästnamn=kolumn[0]

print("Segrare", bästnamn, "som stötte", bästkast, "meter")

当我运行程序时,我得到这个错误:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 85: ordinal not in range(128)

我做错了什么?

非常感谢你,是的,我有 python 3。随着你对导入编解码器的改变感到难过,我现在遇到了另一个错误。

ValueError: max() arg is an empty sequence

我该怎么办?有什么建议?

【问题讨论】:

  • 我在第 7 行 (bästnamn) 收到 SyntaxError,因为:docs.python.org/2/reference/lexical_analysis.html#identifiers。怎么没遇到?
  • @CristFati 因为这可能是 Python 3,其中接受 Unicode 字母字符作为标识符:请参阅 docs.python.org/3/reference/lexical_analysis.html#identifiers
  • 哇,谢谢,我在看Python2(这是第一个弹出的),我没想到他们会在 3.x 中扩展标识符字符集.
  • 关于max,嗯,这是一个不同的问题,所以你真的应该经历整个过程,首先自己努力修复它,然后才发布问题。但简而言之,这意味着您在某处传递max() 一个空序列。我建议使用一些print 调用来查看发生了什么。
  • 停止删除您的问题,这不是 Stack Overflow 的工作方式。

标签: python unicode decode python-unicode


【解决方案1】:

您正在阅读您的文件,就好像它是用 ASCII 编码的一样,但它是 不是。鉴于 0xc3 我会说它可能是用 UTF-8 编码的。

所以,你需要用 UTF-8 编码打开它:

import codecs

fil = codecs.open(txt, "r", "utf-8")

这一切都假设您使用的是 Python 3,其中字符串是 Unicode 默认。由于您对非 ASCII 标识符没有任何问题,这似乎 就像一个安全的假设。

【讨论】:

  • 它是 Python 3,所以你可以使用内置的open(txt, encoding='utf8')
【解决方案2】:

据我所知,您必须输入英文字母才能让 python 能够阅读它。所以你需要改变这些变量:

bästnamn
bästkast

编辑: max() 是给出一个列表的最大值,在字符串的情况下,它会将其分解为字母并返回字母表中的最大字母,如下所示:

myNumList = [1,2,4,5,8,50,10]`
print max(myNumList ) #result 50

myString = 'tree'
print max(myList) #result 't' 

myMixList = [1,2,4,'Apple','20']`
print max(myMixList) #result 'Apple' 

注意它不适用于单个integer,你会得到错误,但你确实有传递列表。

您的代码很好,只是您要输入的文档,初始化时可能有一些错误,我看到您的应用程序至少需要 4 列,但从不使用文件类型无关紧要的第 4 列,但是我相信你的文件应该是这样的:

[String/number] [Number] [Number]

您的文档示例应如下所示:

String1 158 212
String2 584 795
1234567 845 356
String4 356 489
String5 876 215
String6 985 853
String7 111 809
String8 234 058 

注意:如果您在第二列或第三列中有可能导致错误的字符串,则字符串无法转换为floatrandom.normalvariate 不会接受字符串。

【讨论】:

  • Python 3 允许使用非 ASCII 标识符。
  • 非常感谢,是的,我有 python 3。随着您对导入编解码器感到难过,我现在遇到了另一个错误。 ValueError: max() arg 是一个空序列。我该怎么办?有什么建议吗?
  • @programming 我预计问题是由输入的文档引起的,我将编辑我的答案并解释。
猜你喜欢
  • 2013-10-11
  • 2015-02-03
  • 2020-06-28
  • 2015-02-23
  • 1970-01-01
  • 1970-01-01
  • 2017-03-22
  • 1970-01-01
  • 2018-02-21
相关资源
最近更新 更多