2017-05-18 10 views
2

私はここからファイル「pi_million_digits.txt」をダウンロード:私のデータに表示されるのはなぜですか?

https://github.com/ehmatthes/pcc/blob/master/chapter_10/pi_million_digits.txt

を、私はそれを開いて読むためにこのコードを使用:

filename = 'pi_million_digits.txt' 

with open(filename) as file_object: 
    lines = file_object.readlines() 

pi_string = '' 
for line in lines: 
    pi_string += line.strip() 

print(pi_string[:52] + "...") 
print(len(pi_string)) 

生成される出力は、離れてから正しいですが実際には同じ奇妙な記号が前に付いています: "§3.141 ...."

これらの奇妙な記号の原因は何ですか?私はそのようなシンボルが削除されることを期待しているので、行を削除しています。

+1

ファイルが壊れている可能性があります。 –

+0

私はテキストエディタでファイルを見ましたが、それは正常に見えますか?テキストエディタで正常に見えるかもしれませんが、まだ壊れていますか? – Bazman

答えて

3

ISO-8859-1エンコーディングを使用してUTF-8でエンコードされたファイルByte Order Markを開いているようです(おそらくこれはOSのデフォルトのエンコードであるためです)。

あなたはバイトとしてそれを開くと、最初の行を読めば、あなたはこのようなものが表示されるはずです。

>>> next(open('pi_million_digits.txt', 'rb')) 
b'\xef\xbb\xbf3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679\n' 

... \xef\xbb\xbfは、BOMのUTF-8エンコーディングです。

>>> next(open('pi_million_digits.txt', encoding='utf-8')) 
'\ufeff3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679\n' 

ストリップに:UTF-8など

>>> next(open('pi_million_digits.txt', encoding='iso-8859-1')) 
'3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679\n' 

...と開口部には、実際のBOM文字U + FEFFを示しています。ISO-8859-1としてオープン、それは何を取得しているように見えます上記の例のnext()の使用は単なるデモンストレーション用である

>>> next(open('pi_million_digits.txt', encoding='utf-8-sig')) 
'3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679\n' 

:マークアウトは、特殊なエンコーディングutf-8-sigを使用しています。あなたのコードでは、open()行に引数encodingを追加するだけです。

with open(filename, encoding='utf-8-sig') as file_object: 
    # ... etc. 
+1

それは素晴らしい説明です、ありがとう! – Bazman

関連する問題