1

これが私のコードです:

import sys, os

print("█████") #<-- Those are solid blocks.
f= open('file.txt')
for line in f:
    print(line)

file.txt は次のとおりです。

hay hay, guys
████████████

しかし、出力は次のとおりです。

██████
hay hay, guys <----- ***Looks like it outptutted this correctly!***

Traceback (most recent call last):
  File "echofile.py", line 6, in <module>
    print(line)
  File "C:\python33\lib\encodings\cp437.py", line 19, in encode
    return codecs.charmap_encode(input,self.errors,encoding_map)[0]
UnicodeEncodeError: 'charmap' codec can't encode characters in position 1-2: cha
racter maps to <undefined> <------ ***But not from the file!***

なぜこれを行っているのかについて、誰か提案がありますか? IDLE でコードを書き、プログラマーのメモ帳と IDLE の両方で file.txt を編集してみました。ファイルは ASCII / ANSI です。ちなみに、私はPython 3を使用しています。重要なら3.3アルファwin-64。

4

2 に答える 2

2

これは明らかに文字エンコーディングの問題です。

Python 3.x では、すべての文字列が Unicode です。ただし、ファイルを読み書きするときは、Unicode を特定のエンコーディングに変換する必要があります。

デフォルトでは、Python ソース ファイルは UTF-8 として扱われます。ブロックのソース ファイルに貼り付けた文字が正確にはわかりませんが、それが何であれ、Python はそれを UTF-8 として読み取り、動作しているようです。それらを挿入したときに、テキストエディタが有効な UTF-8 に変換されたのではないでしょうか?

バックトレースは、Python が入力ファイルを「コード ページ 437」または元の IBM PC 8 ビット文字セットとして扱っていることを示唆しています。あれは正しいですか?

このリンクは、特定のデコーダーを設定して、入力時に特定のファイル エンコーディングを処理する方法を示しています。

http://lucumr.pocoo.org/2010/2/11/porting-to-python-3-a-guide/

編集:より良いリソースを見つけました:

http://docs.python.org/release/3.0.1/howto/unicode.html

それに基づいて、サンプルコードを次に示します。

with open('mytextfile.txt', encoding='utf-8') as f:
    for line in f:
        print(line, end='')

もともと私は上記を「cp437」に設定していましたが、コメントで「utf-8」が正しいと言われたので、この例に変更を加えました。ここで指定しているのは、ファイルからの入力行の末尾に既に改行があるためです。別の改行を指定end=''する必要はありません。print()

編集:ここでデフォルトのエンコーディングに関する短い議論を見つけました:

http://docs.python.org/release/3.0.1/whatsnew/3.0.html

重要な点: 「プラットフォームに依存するデフォルトのエンコーディングがあり、Unixy プラットフォームでは LANG 環境変数で設定できます (場合によっては、他のプラットフォーム固有のロケール関連の環境変数でも設定できます)。多くの場合、すべてではありません。 、システムのデフォルトは UTF-8 です。このデフォルトを当てにしないでください。」

そのため、Python のデフォルトは UTF-8 だと思っていましたが、常にそうであるとは限りません。実際、スタック バックトレースから、LANG 環境設定を使用したシステムでは、デフォルトとして「cp437」が取得されていると思います。

だから、私もあなたの質問に答えて何かを学びました!

PS上記のコード例を変更してutf-8、それが必要だったので指定しました。

于 2012-04-18T21:06:38.060 に答える
0

その文字列をユニコードにしてみてください:

print(u"█████")
      ^ Add this
于 2012-04-18T21:00:16.400 に答える