Python3 文本编码问题:使用 for 循环从文本文件中读取时额外的第一个字符

Python3 textcoding issue: extra first character when reading from text file using for loop

我正在尝试从文本文件中读取一些股票代码,但似乎存在文本编码问题。

这是一个测试文件的内容'tickers.txt':

SPG
WBA

这是我的测试代码:

    f = open("tickers.txt", 'r')
    for ticker in f:
        t = ticker.strip()
        if t:
          try:
            print(">"+t+"<" + ' length = '+ str(len(t)))
            i = 0
            while i < len(t):
              print(t[i])
              i += 1
            print('End')
          except ValueError:
            print('ValueError ticker')

这是结果输出:

>SPG< length = 4

S
P
G
End
>WBA< length = 3
W
B
A
End

由于某种原因,第一个股票代码中有一个额外的字符,打印时不显示。已经阅读了 Whosebug 上的几个问答我现在假设这是一个文本编码问题,但还不明白如何解决这个问题......我需要在文件打开命令中添加一个 'encoding' 语句吗?如果有,是哪一个?如何检测?

print(t[i]) 更改为 print(i, t[i], '{:04x}'.format(ord(t[i]))),我可以得到以下输出,表明额外的第一个字符是 Byte order mark

>SPG< length = 4
0  feff
1 S 0053
2 P 0050
3 G 0047
End
>WBA< length = 3
0 W 0057
1 B 0042
2 A 0041
End

使用utf_8_sigUTF-8 codec with BOM signature。解码时,将跳过数据开头的可选 UTF-8 编码 BOM。

f = open("tickers.txt", mode='r', encoding='utf_8_sig')

而不是


<strike>
f = open("tickers.txt", 'r')
</strike>

顺便说一句,别忘了f.close()