为什么pywintypes.com_error的信息不可读?
在使用Python 2.7.2和安装了pywin32-216.win32-py2.7的情况下,我用win32com模块在Windows上处理Excel,代码如下:
>>> import win32com.client
>>> xlsApp = win32com.client.Dispatch('Excel.Application')
>>> xlsApp.Workbooks.Open(r'D:/test.xls')
结果出现了一个错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<COMObject <unknown>>", line 8, in Open
pywintypes.com_error: (-2147352567, '\xb7\xa2\xc9\xfa\xd2\xe2\xcd\xe2\xa1\xa3',
(0, u'Microsoft Office Excel', u'\u540d\u4e3a\u201ctest.xls\u201d\u7684\u6587\u6
863\u5df2\u7ecf\u6253\u5f00\u3002\u4e0d\u80fd\u540c\u65f6\u6253\u5f00\u540c\u540
d\u6587\u4ef6\uff0c\u65e0\u8bba\u5b83\u4eec\u662f\u5426\u5728\u540c\u4e00\u6587\
u4ef6\u5939\u4e2d\u3002\n\u8981\u6253\u5f00\u7b2c\u4e8c\u4efd\u6587\u6863\uff0c\
u8bf7\u5173\u95ed\u5df2\u7ecf\u6253\u5f00\u7684\u6587\u6863\uff0c\u6216\u8005\u9
1cd\u65b0\u547d\u540d\u5176\u4e2d\u7684\u4e00\u4e2a\u6587\u6863\u3002', None, 0,
-2146827284), None)
虽然错误信息看起来很复杂,我不知道哪里出了问题!
在网上搜索后,我发现了一些有用的信息,链接在这里:http://www.python-forum.org/pythonforum/viewtopic.php?f=15&t=17665:
pywintypes.com_error: (-2147352567, '发生了异常。', (0, u'Microsoft Office Excel', u"'test .xls' 找不到。请检查文件名的拼写,并确认文件位置是否正确。\n\n如果你是从文件菜单中最近使用的文件列表中打开文件,请确保文件没有被重命名、移动或删除。", u'C:\Program Files\Microsoft Office\OFFICE11\1033\xlmain11.chm', 0, -2146827284), None)
我猜这个问题是一样的,所以我先创建了一个Excel文件'D:/test.xls',然后一切都正常了:
>>> xlsApp.Workbooks.Open(r'D:/test.xls')
<COMObject Open>
如果我能看到更清晰的错误提示,我就能立刻解决问题,根本不会觉得困难!
我想知道为什么我从win32com.client得到的错误信息是这样的?有没有什么办法可以让错误信息更容易理解呢?
非常感谢你的帮助!
2 个回答
我遇到了类似的错误。在我的情况下,我试图使用一个临时文件,创建方式是这样的:
fileprefix = 'Report'
filesuffix = '.xlsx'
filename = tempfile.gettempdir() + '\\' + fileprefix + filesuffix
xfile = tempfile.NamedTemporaryFile(suffix = filesuffix, prefix = fileprefix)
在不同的操作系统上,是否可以在临时文件仍然打开的情况下再次使用这个文件名来打开文件,情况是不同的(在Unix系统上可以这样做;但在Windows NT或更高版本上就不行)。
所以,看起来在Windows操作系统上我不能重复使用那个文件。这就是我出现错误的原因。
在你的情况下,你可能需要检查一下这个文件最开始是怎么创建的。
我想这可能是因为你在使用一些来自远东亚洲的国际化设置(比如中国),而且你是在命令提示符下使用Python。我不太确定问题出在Python、命令提示符,还是两者结合,但无论如何,这两者结合在非拉丁字母的国际化设置下工作得并不好。
我建议你使用IDLE,因为它似乎能更好地支持Unicode字符。我在IDLE中查看最后那段字符串时发生了什么。虽然这些文字对我来说没有意义,但可能对你有用:
IDLE 2.6.4 >>> z = u'\u540d\u4e3a\u201ctest.xls\u201d\u7684\u6587\u6863\u5df2\u7ecf\u6253\u5f00\u3002\u4e0d\u80fd\u540c\u65f6\u6253\u5f00\u540c\u540d\u6587\u4ef6\uff0c\u65e0\u8bba\u5b83\u4eec\u662f\u5426\u5728\u540c\u4e00\u6587\u4ef6\u5939\u4e2d\u3002\n\u8981\u6253\u5f00\u7b2c\u4e8c\u4efd\u6587\u6863\uff0c\u8bf7\u5173\u95ed\u5df2\u7ecf\u6253\u5f00\u7684\u6587\u6863\uff0c\u6216\u8005\u91cd\u65b0\u547d\u540d\u5176\u4e2d\u7684\u4e00\u4e2a\u6587\u6863\u3002' >>> print z 名为“test.xls”的文档已经打开。不能同时打开同名文件,无论它们是否在同一文件夹中。 要打开第二份文档,请关闭已经打开的文档,或者重新命名其中的一个文档。 >>>
不过,即使使用IDLE,当你遇到异常时,文本可能仍然会像之前那样显示。如果发生这种情况,你需要获取最后一次引发的异常数据,并在其中print
出相关的字符串。
要在解释器中获取最后一次引发的异常,你可以使用sys.last_value
。下面是一个不同异常消息的示例:
>>> import sys >>> with open('nonexistent.txt') as f: pass ... Traceback (most recent call last): File "", line 1, in with open('nonexistent.txt') as f: pass IOError: [Errno 2] No such file or directory: 'nonexistent.txt' >>> sys.last_value IOError(2, 'No such file or directory') >>> print(sys.last_value[1]) No such file or directory >>>