0

我正在学习 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

4

2 回答 2

1

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

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

In [2]: with open('test.txt', 'w') as f:
    f.write(t)
   ...:     

此外,您可以getAirportInfo使用subprocess.check_output(). 此外,混合大小写名称只能用于类,而不是函数。参见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)
于 2012-12-19T18:33:40.243 回答
0

我应该在原始答案之前阅读此内容: 编码/解码之间有什么区别?

我总是对字符串和 unicode 转换感到困惑。在我的 Mac 上,导入 sys; sys.getfilesystemencoding()建议子进程返回一个 'utf-8' 字符串 - 所以我不知道为什么 airportInfo.encode('utf-8') 失败。是否可以做 airportInfo.encode('utf-8', 'ignore') 并丢弃无效字符?

另外-您是否尝试将文件写为 wb: outFile = codecs.open('wifi-data.txt', 'wb') - 'w' 不打开 ascii 文件?

关于您的文本编辑器 - 它可能会以不同的方式处理 unicode 字符。如果它以 ascii 格式读取 unicode 文本文件,则 unicode 字符可能会出现乱码。您可以尝试将文件命名为 .xml,根据您的文本编辑器,它可能会更好地读取为 unicode。

于 2012-12-19T18:30:18.840 回答