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

时间:2012-12-19 18:14:47

标签: 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 = [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

2 个答案:

答案 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。