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_sig
— UTF-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()
…
我正在尝试从文本文件中读取一些股票代码,但似乎存在文本编码问题。
这是一个测试文件的内容'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_sig
— UTF-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()
…