我正在尝试从以下站点复制代码: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引入。
由此,鉴于我提供了一个字符串,我认为它应该可以正常工作。那我想念的是什么?
答案 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。