os.path AttributeError:'str'对象没有属性'exists'

时间:2019-03-08 02:17:41

标签: python

我正在尝试从以下站点复制代码:https://www.guru99.com/python-copy-file.html

通常的想法是使用python复制文件。尽管我可以设法解决这些错误,但在这种情况下,我想了解自己在做什么错

import shutil
from os import path
def main(filename):
    if path.exists(filename):
        src = path.realpath(filename)
        head, tail = path.split(src)
        dst = src + ".bak"
        shutil.copy(src,dst)

main('C:\\Users\\test.txt') #This raises the error
main('test.txt') #This works, if the file is in the same folder as the py script

如果与完整目录(main('C:\ Users \ test.txt')一起使用),代码将返回错误AttributeError: 'str' object has no attribute 'exists'。如果我用path.exists()删除行,则会收到类似的错误:AttributeError: 'str' object has no attribute 'realpath'。 通过使用文件名main('test.txt'),只要文件与包含该函数的python脚本位于同一文件夹中,一切都可以使用。

因此,我尝试读取docs,该状态同时说明path.exists()path.realpath()

  

在3.6版中进行了更改:接受类似路径的对象。

由于我正在运行3.7.1 ,所以我很乐意检查什么是“类似路径的对象”:

  

代表文件系统路径的对象。类路径对象可以是表示路径的str或bytes对象,也可以是实现os.PathLike协议的对象。支持os.PathLike协议的对象可以通过调用os.fspath()函数转换为str或bytes文件系统路径。可以分别使用os.fsdecode()和os.fsencode()来保证str或bytes结果。由PEP 519引入。

由此,鉴于我提供了一个字符串,我认为它应该可以正常工作。那我想念的是什么?

2 个答案:

答案 0 :(得分:1)

您的代码:

import shutil
from os import path
def main(filename):
    if path.exists(filename):
        src = path.realpath(filename)
        head, tail = path.split(src)
        dst = src + ".bak"
        shutil.copy(src,dst)

main('C:\\Users\\test.txt') #This raises the error
main('test.txt') #This works, if the file is in the same folder as the py script

它工作正常,但是如果您重新定义名为path的局部变量,如下所示:

import shutil
from os import path


def main(filename):
    if path.exists(filename):
        src = path.realpath(filename)
        head, tail = path.split(src)
        dst = src + ".bak"
        shutil.copy(src, dst)

# The path variable here overrides the path in the main function.
path = 'abc'  

main('C:\\Users\\test.txt')  # This raises the error

我猜这只是您的代码,显然这是一个错误的示例。

我建议在os.path之后使用import os,因为路径变量名称很常见,很容易冲突。

一个很好的例子:

import shutil
import os


def main(filename):
    if os.path.exists(filename):
        src = os.path.realpath(filename)
        head, tail = os.path.split(src)
        dst = src + ".bak"
        shutil.copy(src, dst)

main('C:\\Users\\test.txt')
main('test.txt')

答案 1 :(得分:1)

在外壳上键入

Type(path)

然后检查结果和值,也许您将导入重新定义为变量str。