0

私は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ではありません

4

2 に答える 2

1

テキストがすでにUnicodeである場合は、再エンコードする必要はありません。テキストをファイルに書き込むだけです。それはうまくいくはずです。

In [1]: t = 'äïöú'

In [2]: with open('test.txt', 'w') as f:
    f.write(t)
   ...:     

さらに、をgetAirportInfo使用して簡単にすることができますsubprocess.check_output()。また、大文字と小文字が混在する名前は、関数ではなくクラスにのみ使用する必要があります。PEP8を参照してください。

import subprocess

def get_airport_info():
    args = ['/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport', 
            '--scan', '--xml']
    return subprocess.check_output(args)

airportInfo = get_airport_info()
with open('wifi-data.txt', 'w') as outf:
   outf.write(airportinfo)
于 2012-12-19T18:33:40.243 に答える
0

元の答えの前にこれを読むべきでした: エンコード/デコードの違いは何ですか?

私はいつも文字列とUnicodeの変換の間で混乱します。私のMacでは、sysをインポートします。sys.getfilesystemencoding()は、サブプロセスが「utf-8」文字列を返すことを示唆しているため、airportInfo.encode('utf-8')が失敗する理由がわかりません。AirportInfo.encode('utf-8'、'ignore')を実行して、無効な文字を破棄することは可能ですか?

また、ファイルをwbとして書き込んでみましたか:outFile = codecs.open('wifi-data.txt'、'wb') -'w'はASCIIファイルを開きませんか?

テキストエディタに関して-Unicode文字の処理が異なる場合があります。UnicodeテキストファイルをASCIIとして読み取っている場合、Unicode文字が文字化けして混乱しているように見えることがあります。ファイルに.xmlという名前を付けてみてください。テキストエディタによっては、ファイルをユニコードとして読みやすくする場合があります。

于 2012-12-19T18:30:18.840 に答える