使用pywin32客户端访问映射网络驱动器上的文件时遇到问题

时间:2018-04-12 16:32:06

标签: directory python-3.6 docx pywin32

我目前正在使用以下代码打开word文档(然后保存它,但这与打开文件无关):

    word=win32.Dispatch('Word.Application')
    try:                      
    doc = word.Documents.Open('S:\problem\file.docx')
    except Exception as e:
    print(e)

    (-2147352567, 'Exception occurred.', (0, 'Microsoft Word', 'Sorry, we 
    couldn’t find your file. Is it possible it was moved, renamed or 
    deleted?\r (S:\\problem\\file.docx)', 
    'wdmain11.chm', 24654, -2146823114), None)

"问题"目录是win32客户端无法识别的唯一目录。我已经多次将其重命名为单个字母,以查看命名是否由于某种原因而成为问题,但这似乎不是问题。

docx function- docx.Document也可识别文件路径,并且它能够读取目录中的文件。以下是docx代码段的相同代码和结果:

    Document('S://problem/file.docx')
    <docx.document.Document at 0x83d3c18>

1 个答案:

答案 0 :(得分:0)

Python 字符串中, bkslash “\” )是具有特殊含义的字符之一:它用于创建转义序列(特殊的 char s)以及它后面的char(来自 C )。以下是[Python 3]: String and Bytes literals所述的内容:

  

反斜杠(\)字符用于转义具有特殊含义的字符,例如换行符,反斜杠本身或引号字符。

在你的字符串中,你有“\ p”确定)和“\ f”,它被解释为< strong>单 char 表单Feed - 新页面),使您的路径无效。

为了解决这个问题,请:

  • 在字符串中转义(双重)任何“\”(嗯,这只是一个预防措施,因为你只需要逃避产生转义序列的那些 - 在我们的例子中,“\ p”非常好,除了你想要生成转义序列的那些:'S:\ problem \ file.docx'
  • 使用 r 标记前面加上字符串 raw (请注意,如果字符串以“\”结尾,则表示仍然应该转义,否则它将转义后面的字符串结束标记( ' ) ,产生 SyntaxError ): r'S:\ problem \ file.docx'

作为一般规则,为了确保字符串符合您的想法,可以:

  • 检查它们的长度:如果它小于您看到的字符数(在代码中),则表示至少有一个转义序列
  • 使用 repr

示例

>>> import sys
>>> sys.version
'3.5.4 (v3.5.4:3f56838, Aug  8 2017, 02:17:05) [MSC v.1900 64 bit (AMD64)]'
>>>
>>> s0 = 'S:\problem\file.docx'
>>> s1 = 'S:\\problem\\file.docx'
>>> s2 = r'S:\problem\file.docx'
>>>
>>> len(s0), len(s1), len(s2)
(19, 20, 20)
>>>
>>> s0 == s1, s1 == s2
(False, True)
>>>
>>> repr(s0), repr(s1), repr(s2)
("'S:\\\\problem\\x0cile.docx'", "'S:\\\\problem\\\\file.docx'", "'S:\\\\problem\\\\file.docx'")