2009-06-11 11 views
3

私のWebページを動的にのPython 3は(実際には、あなたがファイルをインポートするのより良い方法を提案することができ

try: 
    with open (filename, 'r') as f: 
     exec(f.read()) 
except IOError: pass 

でたくさんのファイルをインポートするスクリプトによって提供されている新しいサーバー上のUnicodeのファイルを読み取れません。

# contents of language.ru 
title = "Название" 

が、これらはすべてUTF-8のファイルとして保存されていたよう?私は1つがあると確信しています。)

時にはファイルは、異なる言語の文字列を持っています。 Pythonは何の問題コマンドラインでスクリプトを実行しているか、私のMacBookからページを提供する持っていない:

 
    OK: [server command line] python3.0 page.py /index.ru 
    OK: http://whitebox.local/index.ru 

を私たちはちょうどに移動し、サーバーからページを提供しようとすると、エラーがスローされます。

 
     157  try: 
     158   with open (filename, 'r') as f: 
     159    exec(f.read()) 
     160  except IOError: pass 
     161 
     /usr/local/lib/python3.0/io.py in read(self=, n=-1) 
     ... 
     UnicodeDecodeError: 'ascii' codec can't decode byte 0xe1 in position 627: ordinal not in range(128) 

すべてのファイルは私のラップトップからコピーされていて、Apacheが完全にサービスしていました。理由は何ですか?

アップデート:私はそれが私のラップトップ、サーバー上asciiutf8たのでopen()のデフォルトエンコーディングはプラットフォームに依存しているが分かりました。私はPython 3でそれを設定するプログラムごとの関数があるのだろうかと思う(sys.setdefaultencodingsiteモジュールで使われていて、名前空間から削除されている)。

+0

通常、インポートはファイルをインポートするために機能します。それはあなたのために動作しない任意の理由? –

+0

[sys.getfilesystemencoding](https://docs.python.org/3/library/sys.html#sys.getfilesystemencoding)をご覧ください。 Linuxでは、ロケール変数 'LC_CTYPE'がファイル名の意味を定義し、Pythonでも同様に使用されているので、ロケール変数' LC_CTYPE'が正しい値であることを確認する必要があります。 'LC_CTYPE'は同じ名前の環境変数か、' LC_ALL'によって推論されます。 'locale'コマンドを実行すると、現在の値が表示されます。 – Bluehorn

答えて

11

open(filename, 'r', encoding='utf8')を使用してください。 Python 3 docs for openを参照してください。

1

使用コーデックライブラリ、私は、Python 2.6.6を使用していると私はencoding引数と通常のオープンを使用していない:

import codecs 
codecs.open('filename','r',encoding='UTF-8') 
0

with open(fname, 'r', encoding="ascii", errors="surrogateescape") as f: 
    data = f.read() 

# make changes to the string 'data' 

with open(fname + '.new', 'w', 
      encoding="ascii", errors="surrogateescape") as f: 
    f.write(data) 

より多くの情報があるようにあなたが何かを使用することができますon python unicode documents

関連する問題