python 包含.jpg文件的目录已转换为二进制文件[shutil]

qacovj5a  于 2022-10-30  发布在  Python
关注(0)|答案(1)|浏览(136)

更新日期:

基本上,我想将一个大文件夹分为2组。大文件夹由120个子文件夹组成。一个示例子文件夹名称将是*n 02085620-奇瓦瓦州***。n 02085620-Chihuahua有152个.jpg文件。一个示例文件将是n02085620_7.jpg**。您可以看到n 02085620是相同的。
sample_submission.csv中给出了应转到组#1的文件名。其他文件应始终转到组#2。每个文件应位于其各自的母文件夹中。

初始职位:

我想将8580个.img文件复制到120个文件夹中。
我使用shutil来实现这一点。我的主文件夹是source = '/Users/turuud/Desktop/TUT/Dscience_exp/Images/',而我的目标文件夹看起来像这样:
test_path = '/Users/turuud/Desktop/TUT/Dscience_exp/test/'
目标文件夹应该包括120个子文件夹。我使用os.path.join来实现这一点。
问题是,我没有得到120个包含嵌入式图像的目录,而是得到了120个不能按原来方式使用的二进制文件。
下面是完整的代码:

import os
import csv
import shutil

source = '/Users/turuud/Desktop/TUT/Dscience_exp/Images/'
testcsv = '/Users/turuud/Desktop/TUT/Dscience_exp/sample_submission.csv'
test_path = '/Users/turuud/Desktop/TUT/Dscience_exp/test/'

with open(testcsv, 'r') as file:
  csvreader = csv.reader(file)
  next(csvreader)
  for row in csvreader:
    for directory in os.listdir(source):
        if os.path.isdir(os.path.join(source, directory)):
            for img_file in os.listdir(os.path.join(source, directory)):
              if str(row[0]) == str(img_file):
                print(f"{row[0]} and {img_file} are exactly same")
                shutil.copy(os.path.join(source, directory, img_file), os.path.join(test_path, directory))

第一次
在文件夹“test”中,我想有包含各自文件的目录。没有二进制文件。
这是代码最后一行的结果:

shutil.copy(os.path.join(source, directory, img_file), os.path.join(test_path, directory))

被更改为

shutil.copy(os.path.join(source, directory, img_file), test_path)

click here
我想把它们放在它们的母文件夹里。

zxlwwiss

zxlwwiss1#

我会从简化任务开始。假设我们有下一个文件结构:

│   rules.csv
│
└───source
    ├───1
    │       1.jpg
    │       2.jpg
    │
    ├───2
    │       3.jpg
    │       4.jpg
    │
    ├───3
    │       5.jpg
    │       6.jpg
    │
    ├───4
    │       7.jpg
    │       8.jpg
    │
    └───5
            10.jpg
            9.jpg

rules.csv有下一个内容:

1.jpg
2.jpg
5.jpg
9.jpg

我们的python脚本应该创建文件夹result,其中包含两个子文件夹group_1group_2,结构如下:

└───result
    ├───group_1
    │   ├───1
    │   │       1.jpg
    │   │       2.jpg
    │   │
    │   ├───3
    │   │       5.jpg
    │   │
    │   └───5
    │           9.jpg
    │
    └───group_2
        ├───2
        │       3.jpg
        │       4.jpg
        │
        ├───3
        │       6.jpg
        │
        ├───4
        │       7.jpg
        │       8.jpg
        │
        └───5
                10.jpg

要实现这一点,我们首先需要加载CSV并保存每一行的第一列 (即文件名),我将使用set作为容器。然后我们需要遍历源文件夹的子文件夹,并将CSV中存在的文件名保存到 group_1 文件夹,其他文件名保存到 group_2 文件夹。

import csv
from pathlib import Path
from shutil import copy2

source_dir = Path(r"C:\Users\Ori\Pictures")
rules_path = r"C:\Users\Ori\Documents\rules.csv"
result_dir = Path(r"C:\Users\Ori\Pictures\sorted")

group_1_dir = result_dir / "group_1"
group_2_dir = result_dir / "group_2"

with open(rules_path) as f:
    reader = csv.reader(f)
    # next(reader)
    group_1_files = {row[0] for row in reader}

for path in source_dir.iterdir():
    if path.is_dir():
        for file in path.iterdir():
            if file.is_file():
                if file.name in group_1_files:
                    destination = group_1_dir / file.relative_to(source_dir)
                else:
                    destination = group_2_dir / file.relative_to(source_dir)
                destination.parent.mkdir(parents=True, exist_ok=True)
                copy2(file, destination)

您也可以使用.glob()来查找所有的.jpg文件,如果深度可以超过2:

import csv
from pathlib import Path
from shutil import copy2

source_dir = Path(r"C:\Users\Ori\Pictures")
rules_path = r"C:\Users\Ori\Documents\rules.csv"
result_dir = Path(r"C:\Users\Ori\Pictures\sorted")

group_1_dir = result_dir / "group_1"
group_2_dir = result_dir / "group_2"

with open(rules_path) as f:
    reader = csv.reader(f)
    # next(reader)
    group_1_files = {row[0] for row in reader}

for jpg in source_dir.glob(r"*\*.jpg"):
    if jpg.name in group_1_files:
        destination = group_1_dir / jpg.relative_to(source_dir)
    else:
        destination = group_2_dir / jpg.relative_to(source_dir)
    destination.parent.mkdir(parents=True, exist_ok=True)
    copy2(file, destination)

相关问题