在Python中将文件从一个位置复制到另一个位置

27

我有一个名为fileList的列表,其中包含成千上万个文件名和大小,类似于这样:

['/home/rob/Pictures/some/folder/picture one something.jpg', '143452']
['/home/rob/Pictures/some/other/folder/pictureBlah.jpg', '473642']
['/home/rob/Pictures/folder/blahblahpicture filename.jpg', '345345']

我想使用fileList [0]作为源来复制文件到另一个完整的目标位置。类似于:

copyFile(fileList[0], destinationFolder)

并将文件复制到该位置。

当我这样尝试时:

for item in fileList:
    copyfile(item[0], "/Users/username/Desktop/testPhotos")

我遇到了如下的错误:

with open(dst, 'wb') as fdst:
IsADirectoryError: [Errno 21] Is a directory: '/Users/username/Desktop/testPhotos'

有什么东西可以让我解决这个问题呢?我是在 Mac 和 Linux 上使用 Python 3。


1
看看 psytho 的评论,可以查看 os 包进行路径操作。 - mikuszefski
3
https://docs.python.org/2/library/shutil.html 中的 copy 函数可以接受文件夹作为目标。 - mikuszefski
4个回答

36

您可以使用shutil.copy()命令:

例如:

    import shutil

    for item in fileList:
        shutil.copy(item[0], "/Users/username/Desktop/testPhotos")

[摘自Python 3.6.1文档。我尝试过这个方法,它可以正常工作。]


3
我刚意识到这已经作为上面的评论添加了。抱歉重复了。 - Z Yoder
1
这是对OP问题更精确的答案。 - user10186832

29

你需要提供目标文件的完整名称,而不仅仅是文件夹名称。

你可以使用os.path.basename(path)获取文件名,然后使用os.path.join(path, *paths)构建目标路径。

for item in fileList:
    filename = os.path.basename(item[0])
    copyfile(item[0], os.path.join("/Users/username/Desktop/testPhotos", filename))

简单而优雅。谢谢。这很有道理,示例也非常好。非常感谢。 - robster

9
请使用os.path.basename获取文件名,然后在目标位置中使用它。
import os
from shutil import copyfile


for item in fileList:
    copyfile(item[0], "/Users/username/Desktop/testPhotos/{}".format(os.path.basename(item[0])))

1
如果您使用shutil,为什么不直接使用copy,它可以直接将目录作为目标? - mikuszefski

2

您可能需要从源字符串中截取文件名,并将其放在目标路径后面,这样就是完整的文件路径。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接