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时,将得到空输出