我正在学习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编码的行。忽略这一点,打开文件,大多数事情看起来很好,除了几件事:
某些SSID有非ascii字符,例如ä,ö和ü。在屏幕上打印时,它们会正确显示为 \ xc3 \ xa4 ,依此类推。当我打开文件时,它显示不正确,通常是随机垃圾。
在屏幕上打印时,某些xml值看起来像这样:数据(“\ x00 \ x11WLAN-0024FE056185 \ x01 \ x08 \ x82 \ x84 \ x8b \ x96 \ x0c \ ... x10D \ x00 \ x01 \ x02“)但从文件中读取时如下:// 8AAAAAAAAAAAAAAAAAAA ==
我认为这可能是一个编码错误(看到变音符号出现问题,错误信息说明了utf-8编码混乱,以及包含\ x类型字符的文本),我试着看这里可能的解决方案。但是,无论我做什么,仍然有错误:
在codecs.open中添加一个额外的参数'utf-8'会产生一个 UnicodeDecodeError:'ascii'编解码器无法解码位置24227中的字节0x9a:序号不在范围(128)中,生成的文件为空。
使用 outFile.write(airportInfo.encode('utf-8'))显式编码为utf-8,然后将结果保存为同样的错误
不是专家,我尝试解码它,也许我只是做了与需要做的完全相反的事情,但我得到了一个 UnicodeDecodeError:'utf8'编解码器无法解码字节0x8a位置8980:无效的起始字节
唯一可行的(不出所料)是将字符串的repr()写入文件,但这不是我需要的,而且我也无法创建一个完整的.plist文件带有逃脱符号。
所以,请,有人可以帮助我吗?我错过了什么? 如果有帮助,在airportInfo中保存的类型是str(如类型(airportInfo)== str)而不是u
答案 0 :(得分:1)
当文本已经是unicode时,您不需要重新编码。只需将文本写入文件即可。它应该工作。
In [1]: t = 'äïöú'
In [2]: with open('test.txt', 'w') as f:
f.write(t)
...:
此外,您可以使用subprocess.check_output()
使getAirportInfo
更简单。此外,混合大小写名称应仅用于类,而不是函数。请参阅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)
答案 1 :(得分:0)
我应该在原来的回答之前阅读这篇文章: What is the difference between encode/decode?
我总是在字符串和unicode转换之间感到困惑。在我的Mac上,导入sys; sys.getfilesystemencoding()表明子进程返回' utf-8'字符串 - 所以我不知道为什么airportInfo.encode(' utf-8')失败了。是否可以使用airportInfo.encode(' utf-8','忽略')并丢弃无效字符?
此外 - 您是否尝试将文件写为wb: outFile = codecs.open(' wifi-data.txt',' wb') - 没有' w'打开一个ascii文件?
关于文本编辑器 - 可能以不同方式处理unicode字符。如果它以ascii的形式读取unicode文本文件,那么unicode字符可能会出现乱码。您可以尝试命名文件.xml,其中取决于您的文本编辑器可以更好地将其读作unicode。