如何使用Python将airport-s-x的输出保存到文件中

如何使用Python将airport-s-x的输出保存到文件中,python,macos,encoding,Python,Macos,Encoding,我正在学习python,在将一个小函数的输出保存到文件时遇到了麻烦。我的python函数如下所示: #!/usr/local/bin/python import subprocess import codecs airport = '/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport' def getAirportInfo(): arguments = [

我正在学习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()
我想这只适用于Mac,因为它引用了一些私有框架

无论如何,代码几乎可以正常工作。print语句打印一个巨大的xml文件,我想将其存储在一个文件中,以供将来处理。这里是问题的开始。 在上面的版本中,脚本执行时没有任何错误,但是,当我尝试打开文件时,会收到一条错误消息,与utf-8编码的错误行一致。忽略这一点,打开文件,大多数事情看起来都很好,除了以下几点:

  • 一些SSID具有非ascii字符,如ä、ö和ü。在屏幕上打印时,它们将正确显示为\xc3\xa4,依此类推。当我打开文件时,它显示不正确,通常是随机垃圾

  • 一些xml值在屏幕上打印时类似于以下内容:数据(“\x00\x11WLAN-0024FE056185\x01\x08\x82\x84\x8b\x96\x0c\…x10D\x00\x01\x02”),但从文件中读取时类似于此://8aaaaaaaaaaaaaaaaaaaaaaaaaa==

我认为这可能是一个编码错误(因为Umlauts有问题,错误消息说utf-8编码出错,文本包含\x类型的字符),我尝试在这里寻找可能的解决方案。但是,无论我做什么,仍然存在错误:

  • 将附加参数“utf-8”添加到codecs.open会生成一个 UnicodeDecodeError:“ascii”编解码器无法解码位置24227:序号不在范围(128)中的字节0x9a,并且生成的文件为空

  • 在保存之前,使用outFile.write(airportInfo.encode('utf-8'))显式编码到utf-8会导致相同的错误

  • 作为一名专家,我尝试解码它,也许我只是做了与需要做的完全相反的事情,但我得到了一个UnicodeDecodeError:“utf8”编解码器无法解码8980位置的字节0x8a:无效的起始字节

唯一有效的方法(毫不奇怪)是将字符串的repr()写入文件,但这不是我所需要的,而且我也无法制作一个满是转义符号的文件的.plist

拜托,拜托,有人能帮帮我吗?我错过了什么?
如果有帮助的话,保存在airportInfo中的类型是str(与type(airportInfo)==str一样),而不是u

在我最初的答案之前,我应该阅读以下内容:

我总是混淆字符串和unicode转换。在我的mac电脑上,导入系统;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,根据您的文本编辑器,在该文件中,可以更好地将其命名为unicode。

当您的文本已经是unicode时,您不需要重新编码。只需将文本写入文件。它应该会起作用

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

In [2]: with open('test.txt', 'w') as f:
    f.write(t)
   ...:     
此外,您还可以通过使用简化
getAirportInfo
。此外,混合大小写名称只能用于类,不能用于函数。看


Python2和Python3在处理unicode方面有些不同。你用哪一种?此外,如果不使用编解码器,只将数据写入文件,会发生什么情况?我测试了一个简单的案例,就像您的第一行一样,它按预期工作,但在wifi扫描脚本上没有。不幸的是,我现在在另一个位置(不同的wifi名称),无法测试/复制问题。无论如何,非常感谢你的风格指南,从一开始就正确地学习总是好的。
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)