如何使用Python将airport-s-x的输出保存到文件中
我正在学习python,在将一个小函数的输出保存到文件时遇到了麻烦。我的python函数如下所示:如何使用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 = [
#!/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==
- 将附加参数“utf-8”添加到codecs.open会生成一个 UnicodeDecodeError:“ascii”编解码器无法解码位置24227:序号不在范围(128)中的字节0x9a,并且生成的文件为空
- 在保存之前,使用outFile.write(airportInfo.encode('utf-8'))显式编码到utf-8会导致相同的错误
- 作为一名专家,我尝试解码它,也许我只是做了与需要做的完全相反的事情,但我得到了一个UnicodeDecodeError:“utf8”编解码器无法解码8980位置的字节0x8a:无效的起始字节
如果有帮助的话,保存在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)