Python 无法将文件复制到新目录-类型错误:os.PathLike对象

Python 无法将文件复制到新目录-类型错误:os.PathLike对象,python,Python,我正在遍历文件夹(输入)中的文件,并执行一些操作,将结果保存到新文件夹(输出)中的新文件。但是,最终会出现此错误 错误 Traceback (most recent call last): File "mask_class_modifier.py", line 28, in <module> shutil.copy(x, new_mask_dir) File "/Users/g/miniconda2/lib/python3.6/shutil.py", line 244

我正在遍历文件夹(输入)中的文件,并执行一些操作,将结果保存到新文件夹(输出)中的新文件。但是,最终会出现此错误

错误

Traceback (most recent call last):
  File "mask_class_modifier.py", line 28, in <module>
    shutil.copy(x, new_mask_dir)
  File "/Users/g/miniconda2/lib/python3.6/shutil.py", line 244, in copy
    dst = os.path.join(dst, os.path.basename(src))
  File "/Users/g/miniconda2/lib/python3.6/posixpath.py", line 146, in basename
    p = os.fspath(p)
TypeError: expected str, bytes or os.PathLike object, not tuple
可复制代码

mask1 = Image.open(urlopen('https://user-images.githubusercontent.com/3885659/78411130-24eee380-75fe-11ea-831c-84ca2eae82ac.png'))
mask2 = Image.open(urlopen('https://user-images.githubusercontent.com/3885659/78411130-24eee380-75fe-11ea-831c-84ca2eae82ac.png'))
mask3 = Image.open(urlopen('https://user-images.githubusercontent.com/3885659/78411130-24eee380-75fe-11ea-831c-84ca2eae82ac.png'))

masks_list = [mask1, mask2, mask3]

new_masks=[]

for x in masks_list:
  mask = np.array(x)
  mask[mask==3] = 50, 
  mask[mask==4] = 51
  new_masks.append(mask)

这里的问题是这一行
results1.append((filename.path,mask))
。使用双括号意味着您正在将元组添加到列表
results1
。然后,当您迭代该列表时,x将成为一个元组,
shutil.copy
函数不能将元组作为其第一个参数

要修复错误,请删除
结果1.append
行中的
、掩码。您不需要将掩码添加到列表中,因为您以后不会使用它。删除此项将停止此元组,并意味着复制时函数将按预期工作

另一种允许您在列表中保留掩码的解决方案是在copy函数调用中的
x
之后添加
[0]
,以指定要使用元组中的第一项(文件路径)


如果要保存新图像而不是制作副本,请将最后一行更改为
image.fromarray(x[1]).save(new\u mask\u dir+x[0])
,将新图像另存为新文件。执行此操作时,请确保
results1.append
行与此答案之前给出错误时(不会再出现错误)

这里的问题是这行
results1.append((filename.path,mask))
。使用双括号意味着您正在将元组添加到列表
results1
。然后,当您迭代该列表时,x将成为一个元组,
shutil.copy
函数不能将元组作为其第一个参数

要修复错误,请删除
结果1.append
行中的
、掩码。您不需要将掩码添加到列表中,因为您以后不会使用它。删除此项将停止此元组,并意味着复制时函数将按预期工作

另一种允许您在列表中保留掩码的解决方案是在copy函数调用中的
x
之后添加
[0]
,以指定要使用元组中的第一项(文件路径)


如果要保存新图像而不是制作副本,请将最后一行更改为
image.fromarray(x[1]).save(new\u mask\u dir+x[0])
,将新图像另存为新文件。执行此操作时,请确保
results1.append
行与此答案之前的内容完全相同,当时它会给您一个错误(不会再出现了)

我认为这就是您正在尝试执行的操作。您没有使用新掩码保存原始图像,
shutil
也不会将掩码保存到新文件<代码>追加
仅在列表末尾添加一个值。如果您试图使用新的掩码保存图像,请尝试下面的代码。在本例中,我使用了一个文件名作为字典中的键,但您可以只使用原始文件名

import sys
import os
from PIL import Image
import shutil
import numpy as np

mask_dir = "input/"
new_mask_dir = "output/"

if not os.path.exists(new_mask_dir):
    os.mkdir(new_mask_dir)

for filename in os.scandir(mask_dir):
    if filename.path.endswith(".png"):
        image = Image.open(filename.path)
        mask = np.array(image)
        mask[mask == 3] = 50
        mask[mask == 4] = 51
        masked_img = Image.fromarray(mask)
        new_img_path = os.path.join(new_mask_dir, filename.name)
        masked_img.save(new_img_path)

我想这就是你想要做的。您没有使用新掩码保存原始图像,
shutil
也不会将掩码保存到新文件<代码>追加
仅在列表末尾添加一个值。如果您试图使用新的掩码保存图像,请尝试下面的代码。在本例中,我使用了一个文件名作为字典中的键,但您可以只使用原始文件名

import sys
import os
from PIL import Image
import shutil
import numpy as np

mask_dir = "input/"
new_mask_dir = "output/"

if not os.path.exists(new_mask_dir):
    os.mkdir(new_mask_dir)

for filename in os.scandir(mask_dir):
    if filename.path.endswith(".png"):
        image = Image.open(filename.path)
        mask = np.array(image)
        mask[mask == 3] = 50
        mask[mask == 4] = 51
        masked_img = Image.fromarray(mask)
        new_img_path = os.path.join(new_mask_dir, filename.name)
        masked_img.save(new_img_path)


您正在使用
(filename.path,mask)
创建一个元组,并在
shutil.copy
中调用该元组,但shutil copy只获取要复制的文件的字符串路径和要复制到的目标。另外,您没有将新掩码保存到原始文件或副本中。
append
功能将保存新掩码,而shutil将它们复制到新文件夹中。否?append功能不会将掩码保存回原始图像(即文件)
shutil.copy
将文件从一个地方复制到另一个地方,它不会将信息覆盖到文件中。您正在使用
(filename.path,mask)
创建一个元组,并在
shutil.copy
中调用该元组,但shutil copy只获取要复制的文件的字符串路径和要复制到的目标。另外,您没有将新掩码保存到原始文件或副本中。
append
功能将保存新掩码,而shutil将它们复制到新文件夹中。否?append功能不会将掩码保存回原始图像(即文件)
shutil.copy
将文件从一个地方复制到另一个地方,它不会将信息覆盖到文件中。我没有收到错误,但输出与输入相同。它没有执行我试图在循环中执行的操作。现在编辑,请参阅我的最后一段,以了解抛出此错误的原因。
AttributeError:'numpy.ndarray'对象没有属性“save”
将Image.fromarray()添加到x[1],如立即回答中所示错误-
FileNotFoundError:[Errno 2]没有这样的文件或目录:
我确信没有丢失任何文件。我没有收到错误,但输出与输入相同。它没有执行我试图在循环中执行的操作。现在编辑,请参阅我的最后一段,以了解抛出此错误的原因。
AttributeError:'numpy.ndarray'对象没有属性“save”
将Image.fromarray()添加到x[1],如立即回答中所示错误-
FileNotFoundError:[Errno 2]没有这样的文件或目录:
我确信没有文件丢失。谢谢,但是如果
imgs
是一个包含许多文件的文件夹,该怎么办?然后以与您相同的方式阅读它们。输入一个列表,获取文件名等。查看我代码的最后三行或四行,并将其应用到您的代码中。当我将代码中的最后三行替换为
masked\u img=Image.fromarray(mask)new\u img\u path=o时,将得到空输出