新手·ing 发表于 2017-4-6 19:26:52

Python:每日一题 21(答题领鱼币)

本帖最后由 新手·ing 于 2017-4-7 19:23 编辑

现在有一个文件夹Filetest,文件夹中有大量的图片
图片的名称是这样的12345-1.jpg、23456-1.jpg、12345-2.jpg、12345-3.jpg...
图片的数量很多,格式都是数字串号+横杠+图片编号


现在需要进行操作:
1,在Filetest文件夹中建立子文件夹,子文件夹的个数由图片的前面一个数字串号来决定,例如,上面的图片12345-1.jpg、12345-2.jpg、12345-3.jpg这三个需要建立一个文件夹名称为12345的文件夹,依次类推
2,把所有图片分类放到新建的文件夹中,规律就是按照图片前面的串号来分


感谢@gopythoner 的题目,难倒了我(本来就新手...),但是有大佬给出了解答!(所以就是我的了{:10_256:} )

**** Hidden Message *****

欢迎小伙伴们,一起答题!
如果你有能力,欢迎加入我们!
已经上车老司机:@ooxx7788 @lumber2388779   
{:10_298:} 点我上车{:10_298:}

新手·ing 发表于 2017-4-6 19:30:42

@gopythoner @lumber2388779 @ooxx7788 @冬雪雪冬
来来来!

冬雪雪冬 发表于 2017-4-6 20:01:54

文件操作都有些忘了,看了一下几个模块的方法,慢慢写了起来。
先生成需要的文件吧,我可不想手动的一个个文件的建立。
import os
os.chdir('f:/filetest')
for i in range(12345,12348):
    for j in range(1,4):
      with open('%d-%d.jpg'%(i, j), 'w'):
            pass

下面进入正题,先用listdir得到文件列表,再分解得到数字串号,建立目录,再移动文件。
import os, os.path, shutil
os.chdir('f:/filetest')
for each in os.listdir():
    if os.path.isfile(each):
      path = each.split('-')
      if not os.path.exists(path):
            os.mkdir(path)
      shutil.move(each, './' + path + '/' + each)

新手·ing 发表于 2017-4-6 20:03:57

冬雪雪冬 发表于 2017-4-6 20:01
文件操作都有些忘了,看了一下几个模块的方法,慢慢写了起来。
先生成需要的文件吧,我可不想手动的一个个 ...

{:10_250:}文件操作忘了,还能如此简短,不愧是大佬{:10_297:}
这题我不会...学习了{:10_254:}

新手·ing 发表于 2017-4-7 19:22:46

呦,来人啊

dori233 发表于 2017-4-8 15:32:54

# -*- coding: utf-8 -*-
import os

def s_jpg(dir1):
    """'# 判断指定文件夹下的文件type是不是图片'
    'dir1 ,输入一个指定目录'
    'dir_list,输入一个工作目录的目录List'
    'return : 输出一个jpg文件收集的list"""
    os.chdir(dir1)
    print('当前目录是:',os.getcwd())
    dir_list = os.listdir(os.curdir)
    jpg_list = list()
    for file in dir_list:
      if os.path.isfile(file):
            exten = os.path.splitext(file)
            if exten in '.jpg.JPG':
                jpg_list.append(file)
    print('当前有%d个图片文件等待处理' % len(jpg_list))
    return jpg_list

def split_name(jpg_list):
    """jpg_list 输入一个jpg文件收集的list'
    '遍历文件做一个交集(set)dir_file,然后遍历dir_file去创建目录'
    '遍历目录,文件夹,运用cmd的move命令把文件放进文件夹里面'
    """
    dir_file = set()
    for file in jpg_list:
      cut_name = file.split('_')
      print(cut_name)
      dir_file.add(cut_name)
    # 开始创建目录
    for N_dir in dir_file:
      os.mkdir(N_dir)
    # 遍历目录
    for N_dir in dir_file:
      # 遍历文件
      for file in jpg_list:
            cut_name = file.split('_')
            if cut_name == N_dir:
                # 运用cmd的move命令把 文件怼进去
                os.system('move "%s" "%s"' % (file, N_dir))

# 开始工作
dir1 = input('请输入你的工作(文件夹)目录:')
jpg_list = s_jpg(dir1)
split_name(jpg_list)


如果不想用集合可以用try的方法,去遍历文件创建文件夹.
还有,我是看着硬盘的图片实际情况做的,他们命名格式多为'_'下划线作为分隔.如果想要改成像题目一样的话.可以改cut_name = file.split('_')这里.
{:10_266:}新手刚学了1个月左右.

willLin 发表于 2017-5-8 21:37:30

汗颜啊

七度寒 发表于 2017-5-14 22:51:39

kankan

solomonxian 发表于 2017-6-4 21:34:53

import os
import shutil


def new_path(path):
    file_dict = {}
    # 转换到当前文件夹
    os.chdir(path)
    files = os.listdir()

    # 把jpg文件找出来,建字典区分文件名和数字串
    for file in files:
      if file[-3:] == 'jpg':
            file_dict = file.split('-')
      else: pass

    # 新建文件夹,要防止文件夹已存在
    for each_value in file_dict.values():
      try:
            os.mkdir(each_value)
      except OSError: pass

    # 移动文件
    for each_key in file_dict.keys():
      shutil.move(each_key, file_dict)
      

bozhen 发表于 2017-8-15 20:59:13

本帖最后由 bozhen 于 2017-8-15 21:17 编辑

# 默认'E:\A\C'下全是.jpg文件
import os
import shutil

os.chdir(r'E:\A\C')
dir_dict = dict()

for each in os.listdir(os.curdir):
    each_file = os.path.splitext(each) # 去掉扩展名,只留文件名
    each_file_id = each_file[:each_file.index('-')] # 去掉文件名中-以及后面的字符
    dir_dict.setdefault(each,each_file_id)

for each_file,each_idin dir_dict.items():# 依次创建文件夹
    if not os.path.exists(each_id): # 文件夹不存在即创建
      os.mkdir(each_id)
   
    shutil.move(each_file,each_id) # 依次将文件move到对应文件夹

renze 发表于 2017-9-18 19:26:12

学习学习

pillar 发表于 2017-10-10 11:10:20

学习,看看大神怎样写的

songkunhuang 发表于 2017-10-10 13:07:16

testing

朔夜 发表于 2017-10-18 11:18:36

本帖最后由 朔夜 于 2017-10-18 11:26 编辑

def fun(temp):
    # 输入一条目录
    items=os.listdir(temp)
    # 循环目录下的所有文件
    for each in items:
      # 判断文件是否是文件还是目录
      if os.path.isfile(each):
          item=os.path.splitext(each)
            # 文件名分割,获取-前面的内容
            name=item.split("-")
            # 去新路径下判断有没有以这个名字命名的文件夹
            if os.path.exists("D:/path"+name):
                # 如果存在就将文件移动到这个文件夹内
                shutil.move(each, "D:/path"+name)
            else:
                # 如果不存在就新建一个文件夹,并将文件存入
                os.mkdir("D:/path"+name)
                shutil.move(each, "D:/path" + name)
      else:
            # 如果是目录的滑回调函数
            fun(each)

伪教父 发表于 2017-10-27 11:00:12

文件操作不太会

yang_zhong_well 发表于 2017-10-31 16:43:32

看看隐藏内容是啥。

流浪者python 发表于 2017-12-9 15:24:56

import os
import shutil

filenames = []
curdir = os.getcwd()
if os.path.isdir(curdir):
    os.chdir(curdir)
    filelist = os.listdir(curdir)
    for file in filelist:
      if file.endswith('.jpg'):
            filenames.append(file)

for filename in filenames:
    _filename = os.path.splitext(filename)
    prefix = _filename.split('-')
    if not os.path.isdir(os.path.join(curdir, prefix)):
      os.mkdir(prefix)
      shutil.move(os.path.join(curdir, filename), os.path.join(curdir, prefix, filename))
    else:
      shutil.move(os.path.join(curdir, filename), os.path.join(curdir, prefix, filename))

你不知道我名字 发表于 2017-12-28 08:25:47

1 2 3

topscien 发表于 2018-3-2 14:05:42

这题目有意思

Charonnnnn 发表于 2018-3-27 19:50:12

ls
页: [1] 2 3
查看完整版本: Python:每日一题 21(答题领鱼币)