我正在学习 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 上工作,因为它引用了一些 PrivateFrameworks。
无论如何,代码几乎可以正常工作。print 语句打印一个巨大的 xml 文件,我想将其存储在一个文件中,以供将来处理。从这里开始问题。在上面的版本中,脚本执行没有任何错误,但是,当我尝试打开文件时,我收到一条错误消息,与 utf-8 encoding 错误行一致。忽略这一点,打开文件,大多数事情看起来都很好,除了几件事:
一些 SSID 有非 ascii 字符,如 ä、ö 和 ü。在屏幕上打印时,它们会正确显示为\xc3\xa4等等。当我打开文件时,它显示不正确,通常是随机垃圾。
某些 xml 值在屏幕上打印时如下所示: Data("\x00\x11WLAN-0024FE056185\x01\x08\x82\x84\x8b\x96\x0c\ ... x10D\x00\x01\x02") 但像这样从文件读取时://8AAAAAAAAAAAAAAAAAA==
我认为这可能是一个编码错误(看到元音变音有问题,错误消息说明了 utf-8 编码被搞砸了,以及包含 \x 类型字符的文本),我试着在这里寻找可能的解决方案. 但是,无论我做什么,仍然有错误:
向 codecs.open 添加一个附加参数 'utf-8' 会产生 UnicodeDecodeError: 'ascii' codec can't decode byte 0x9a in position 24227: ordinal not in range(128)并且生成的文件是空的。
在保存之前使用outFile.write(airportInfo.encode('utf-8'))显式编码为 utf-8会导致相同的错误
不是专家,我尝试对其进行解码,也许我只是在做与需要做的完全相反的事情,但我得到了一个UnicodeDecodeError: 'utf8' codec can't decode byte 0x8a in position 8980: invalid start byte
唯一有效的(不出所料)是将字符串的 repr() 写入文件,但这不是我需要的,而且我无法制作一个很好的 .plist 文件,其中包含转义符号.
所以请,请,有人可以帮助我吗?我错过了什么?如果有帮助,则保存在 airportInfo 中的类型是 str (如 type(airportInfo) == str 中)而不是 u