私はPythonを学んでいますが、小さな関数の出力をファイルに保存するのに問題があります。私のPython関数は次のとおりです。
#!/usr/local/bin/python
import subprocess
import codecs
airport = '/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport'
def getAirportInfo():
arguments = [airport, "--scan" , "--xml"]
execute = subprocess.Popen(arguments, stdout=subprocess.PIPE)
out, err = execute.communicate()
print out
return out
airportInfo = getAirportInfo()
outFile = codecs.open('wifi-data.txt', 'w')
outFile.write(airportInfo)
outFile.close()
一部のPrivateFrameworksを参照しているため、これはMacでのみ機能すると思います。
とにかく、コードはほぼ正常に機能します。printステートメントは、将来の処理のために、ファイルに保存したい巨大なxmlファイルを出力します。そして、ここで問題を開始します。上記のバージョンでは、スクリプトはエラーなしで実行されますが、ファイルを開こうとすると、utf-8エンコーディングのエラー行に沿ってエラーメッセージが表示されます。これを無視すると、ファイルが開きます。いくつかのことを除いて、ほとんどのものは正常に見えます。
一部のSSIDには、ä、ö、üなどの非ASCII文字が含まれています。それらを画面に印刷すると、\ xc3\xa4などとして正しく表示されます。ファイルを開くと、通常のランダムなゴミである誤った表示になります。
一部のxml値は、画面に印刷すると次のようになります。Data( "\ x00 \ x11WLAN-0024FE056185 \ x01 \ x08 \ x82 \ x84 \ x8b \ x96 \x0c\…x10D\x00 \ x01 \ x02")ファイルから読み取った場合:// 8AAAAAAAAAAAAAAAAAAA ==
エンコーディングエラーの可能性があると考え(Umlautsに問題があるため、エラーメッセージにutf-8エンコーディングが混乱していること、および\ xタイプの文字を含むテキストが表示されている)、考えられる解決策を探してみました。 。ただし、私が何をしても、エラーが発生します。
codecs.openに引数「utf-8」を追加すると、 UnicodeDecodeErrorが生成されます。「ascii」コーデックは、位置24227のバイト0x9aをデコードできません。序数はrange(128)になく、生成されたファイルは空です。
保存する前にoutFile.write(airportInfo.encode('utf-8'))を使用してutf-8に明示的にエンコードすると、同じエラーが発生します
専門家ではないので、デコードしようとしました。必要な処理とは正反対のことを行っていたのかもしれませんが、UnicodeDecodeErrorが発生しました:'utf8'コーデックは位置8980のバイト0x8aをデコードできません:無効な開始バイト
(当然のことながら)機能したのは、文字列のrepr()をファイルに書き込むことだけでしたが、それは私が必要とするものではなく、エスケープ記号でいっぱいのファイルの素敵な.plistを作成することもできません。
だからお願いします、誰かが私を助けてくれますか?私は何が欠けていますか?それが役立つ場合、airportInfoに保存されるタイプはstr(type(airportInfo)== strのように)であり、uではありません