鱼C论坛

 找回密码
 立即注册
查看: 1303|回复: 7

[已解决]Python文件库搜索代码怎么写,求大佬指导,感觉很难

[复制链接]
发表于 2017-10-12 03:47:27 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
程序设计要求输入 D 空格 文件夹路径 ——打印所有该路径下的子目录
                             R 空格  文件夹路径——打印所有路径下的子目录,并打印所有子目录的子目录,直到最后的文件名
接下来输入           A证明以上所有文件均在考虑范围内
                             N 空格 文件名 则只选定这个文件进行操作
                             E 空格 文件扩展名   则选定所有这个扩展名的文件
                             T 空格  一个text    则选中所有包含这段text的文件
                             < 空格  一串数字  则选中所有字符数小于这段数字的文件
                             >空格  一串数字   则选中所有字符数大于这段数字的文件

然后打印出经过这些条件筛选后的文件路径
没有的话显示ERROR

然后对这个选中的文件进行操作
输入F,打印出文件的第一行文字
输入D,复制这个文件到初始目录 并加上.dup  例如选中了C:\pictures\boo.jpg,就复制出C:\pictures\boo.jpg.dup.
出入T,把文件修改时间修改为现在的电脑时间

如果有任何一步不能执行都要打印ERROR但是程序不会结束或者崩溃

例子:
R C:\Test\Project1\Example
C:\Test\Project1\Example\test1.txt
C:\Test\Project1\Example\test2.txt
C:\Test\Project1\Example\Sub\meee.txt
C:\Test\Project1\Example\Sub\test1.txt
C:\Test\Project1\Example\Sub\youu.txt
C:\Test\Project1\Example\Zzz\zzz.py
N
ERROR
N test1.txt
C:\Test\Project1\Example\test1.txt
C:\Test\Project1\Example\Sub\test1.txt
Q
ERROR
F
This is a line of text
Hello, my name is Boo

最佳答案
2017-10-12 22:24:10
  1. import os
  2. import shutil
  3. import time


  4. class SearchFile():
  5.     """
  6.     D 空格 文件夹路径 ——打印所有该路径下的子目录
  7.     R 空格  文件夹路径——打印所有路径下的子目录,并打印所有子目录的子目录,直到最后的文件名
  8.     接下来输入:
  9.     A证明以上所有文件均在考虑范围内
  10.     N 空格 文件名 则只选定这个文件进行操作
  11.     E 空格 文件扩展名   则选定所有这个扩展名的文件
  12.     T 空格  一个text    则选中所有包含这段text的文件
  13.     < 空格  一串数字  则选中所有字符数小于这段数字的文件
  14.     >空格  一串数字   则选中所有字符数大于这段数字的文件

  15.     然后打印出经过这些条件筛选后的文件路径
  16.     没有的话显示ERROR
  17.     然后对这个选中的文件进行操作
  18.     输入F,打印出文件的第一行文字
  19.     输入D,复制这个文件到初始目录 并加上.dup
  20.     出入T,把文件修改时间修改为现在的电脑时间

  21.     如果有任何一步不能执行都要打印ERROR但是程序不会结束或者崩溃
  22.     """

  23.     def __init__(self):
  24.         print('---使用规则:---')
  25.         print('D 空格 文件夹路径--->:查找子目录')
  26.         print('R 空格 文件夹路径--->:遍历子目录及文件')
  27.         print('      A          --->:选取目录下的所有文件')
  28.         print('N 空格 文件名    --->:选取所有指定文件')
  29.         print('E 空格 文件扩展名--->:选取指定类型文件')
  30.         print('T 空格 一个text  --->:返回内容包含text的文件名')
  31.         print('< 空格 一串数字  --->:返回所有字符数小于这段数字的文件')
  32.         print('> 空格 一串数字  --->:返回所有字符数大于这段数字的文件')
  33.         print('      F          --->:第一行文字')
  34.         print('      D          --->:复制这个文件到初始目录 并加上.dup')
  35.         print('      T          --->:查询文件修改时间')
  36.         print('输入!q退出!')
  37.         print('--------------')

  38.     def find_children(self, path):
  39.         """
  40.         查找路径下的所有子目录
  41.         :param path: 需要查找子目录的路径
  42.         :return:
  43.         """
  44.         dir_list = []
  45.         files = os.listdir(path)
  46.         for file in files:
  47.             filepath = os.path.join(path, file)
  48.             if os.path.isdir(filepath):
  49.                 dir_list.append(filepath)
  50.         return dir_list

  51.     def find_all(self, path):
  52.         """
  53.         遍历目录下的所有子目录及文件
  54.         :param path: 需要遍历的路径
  55.         :return:
  56.         """
  57.         file_list = []
  58.         files = os.walk(path)
  59.         for file in files:
  60.             if file[1] == [] and file[2] == []:
  61.                 file_list.append(file[0])
  62.             elif file[2] != []:
  63.                 for filename in file[2]:
  64.                     file_list.append(os.path.join(file[0],filename))
  65.         return file_list

  66.     def find_files(self, path):
  67.         """
  68.         遍历路径下的所有文件,但不包括空目录
  69.         :param path: 需要遍历的路径
  70.         :return:
  71.         """
  72.         files = os.walk(path)
  73.         files_list = []
  74.         for file in files:
  75.             if file[0] != []:
  76.                 for filename in file[2]:
  77.                     files_list.append(os.path.join(file[0],filename))
  78.         return files_list

  79.     def find_filename(self,path,filename):
  80.         """
  81.         查找你指定目录下,文件名为filename的文件
  82.         filename必须包含文件类型
  83.         :param path:
  84.         :param filename:必须包含类型
  85.         :return:
  86.         """
  87.         file_list = []
  88.         if os.path.isfile(path):
  89.             files = [path]
  90.         else:
  91.             files = self.find_files(path)
  92.         for file in files:
  93.             if filename == os.path.basename(file):
  94.                 file_list.append(file)
  95.         return file_list

  96.     def find_filetype(self, path, types):
  97.         """
  98.         查找目录下所有指定的文件类型
  99.         :param path:
  100.         :param types: 需要查找的类型。目前只支持单类型查找
  101.         :return:
  102.         """
  103.         file_list = []
  104.         if os.path.isfile(path):
  105.             files = [path]
  106.         else:
  107.             files = self.find_files(path)
  108.         for file in files:
  109.             if types in os.path.splitext(file)[1]:
  110.                 file_list.append(file)
  111.         return file_list

  112.     def find_filetext(self,filelist,text):
  113.         """
  114.         查询文件列表中的所有文件,如果文件中包含txt的内容,则返回文件名
  115.         :param filelist:需要查找内容的文件列表
  116.         :param text:
  117.         :return:
  118.         """
  119.         file_list = []
  120.         for file in filelist:
  121.             with open(file,'r') as f:
  122.                 if text in f.read():
  123.                     file_list.append(file)
  124.         return file_list

  125.     def find_size(self,filelist,compares,num):
  126.         """
  127.         根据输入的符号是<,>;以及num,返回指定的文件名
  128.         :param filelist:
  129.         :param compare:比较符
  130.         :param num:字符数
  131.         :return:
  132.         """
  133.         file_list =[]
  134.         for file in filelist:
  135.             size = os.stat(file).st_size
  136.             if compares == '>'and size > num :
  137.                 file_list.append(file)
  138.             elif compares == '<' and size > num:
  139.                 file_list.append(file)
  140.         return file_list

  141.     def first_line(self,filename):
  142.         """
  143.         返回文件的非空第一行
  144.         :param filename:
  145.         :return:
  146.         """
  147.         with open(filename,'r') as f:
  148.             if f.read().lstrip() == '':
  149.                 print('空文档')
  150.                 f.close()
  151.             else:
  152.                 with open(filename,'r') as f:
  153.                     while True:
  154.                         str1 = f.readline()
  155.                         if str1.lstrip()== '':
  156.                             continue
  157.                         else:
  158.                             print(str1,end='')
  159.                             break

  160.     def copy_file(self,filename):
  161.         """
  162.         复制这个文件到初始目录 并加上.dup
  163.         :param filename:
  164.         :return:
  165.         """
  166.         shutil.copyfile(filename,filename+'.dup')

  167.     def find_mtime(self,filename):
  168.         """
  169.         查看修改文件的时间,这个时间是只读的。不知道怎么修改
  170.         :param filename:
  171.         :return:
  172.         """
  173.         info = os.stat(filename)
  174.         t = time.localtime(info.st_mtime)
  175.         return time.strftime("%Y-%m-%d %H:%M:%S",t)


  176.     def main(self):
  177.         """

  178.         :return:
  179.         """
  180.         while True:
  181.             str1 = input('请开始输入吧:')
  182.             if str1 == '!q':
  183.                 break
  184.             types = str1.split(' ')[0]

  185.             if types == 'D':
  186.                 dir = str1.split(' ')[1]
  187.                 file_list = self.find_children(dir)
  188.                 print(file_list)
  189.             elif types == 'R':
  190.                 dir = str1.split(' ')[1]
  191.                 file_list = self.find_all(dir)
  192.                 print(file_list)
  193.                 """
  194.                 所有的方法我已经写了。剩下的按照你的想法往下泄了。
  195.                 """

  196. if __name__ == '__main__':

  197.     try:
  198.         SearchFile().main()
  199.     except:
  200.         print('ERROR')
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-10-12 08:34:32 | 显示全部楼层

回帖奖励 +1 鱼币

本帖最后由 jerryxjr1220 于 2017-10-12 08:42 编辑

你先去学习一下io库和os库吧,基本上你的需求都能搞定。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-12 09:12:58 | 显示全部楼层

回帖奖励 +1 鱼币

os和os.path 两个模块包含了对文件的基本复制,删除移动等操作
用内置函数open和close可以对单个文件进行操作
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-12 22:24:10 | 显示全部楼层    本楼为最佳答案   

回帖奖励 +1 鱼币

  1. import os
  2. import shutil
  3. import time


  4. class SearchFile():
  5.     """
  6.     D 空格 文件夹路径 ——打印所有该路径下的子目录
  7.     R 空格  文件夹路径——打印所有路径下的子目录,并打印所有子目录的子目录,直到最后的文件名
  8.     接下来输入:
  9.     A证明以上所有文件均在考虑范围内
  10.     N 空格 文件名 则只选定这个文件进行操作
  11.     E 空格 文件扩展名   则选定所有这个扩展名的文件
  12.     T 空格  一个text    则选中所有包含这段text的文件
  13.     < 空格  一串数字  则选中所有字符数小于这段数字的文件
  14.     >空格  一串数字   则选中所有字符数大于这段数字的文件

  15.     然后打印出经过这些条件筛选后的文件路径
  16.     没有的话显示ERROR
  17.     然后对这个选中的文件进行操作
  18.     输入F,打印出文件的第一行文字
  19.     输入D,复制这个文件到初始目录 并加上.dup
  20.     出入T,把文件修改时间修改为现在的电脑时间

  21.     如果有任何一步不能执行都要打印ERROR但是程序不会结束或者崩溃
  22.     """

  23.     def __init__(self):
  24.         print('---使用规则:---')
  25.         print('D 空格 文件夹路径--->:查找子目录')
  26.         print('R 空格 文件夹路径--->:遍历子目录及文件')
  27.         print('      A          --->:选取目录下的所有文件')
  28.         print('N 空格 文件名    --->:选取所有指定文件')
  29.         print('E 空格 文件扩展名--->:选取指定类型文件')
  30.         print('T 空格 一个text  --->:返回内容包含text的文件名')
  31.         print('< 空格 一串数字  --->:返回所有字符数小于这段数字的文件')
  32.         print('> 空格 一串数字  --->:返回所有字符数大于这段数字的文件')
  33.         print('      F          --->:第一行文字')
  34.         print('      D          --->:复制这个文件到初始目录 并加上.dup')
  35.         print('      T          --->:查询文件修改时间')
  36.         print('输入!q退出!')
  37.         print('--------------')

  38.     def find_children(self, path):
  39.         """
  40.         查找路径下的所有子目录
  41.         :param path: 需要查找子目录的路径
  42.         :return:
  43.         """
  44.         dir_list = []
  45.         files = os.listdir(path)
  46.         for file in files:
  47.             filepath = os.path.join(path, file)
  48.             if os.path.isdir(filepath):
  49.                 dir_list.append(filepath)
  50.         return dir_list

  51.     def find_all(self, path):
  52.         """
  53.         遍历目录下的所有子目录及文件
  54.         :param path: 需要遍历的路径
  55.         :return:
  56.         """
  57.         file_list = []
  58.         files = os.walk(path)
  59.         for file in files:
  60.             if file[1] == [] and file[2] == []:
  61.                 file_list.append(file[0])
  62.             elif file[2] != []:
  63.                 for filename in file[2]:
  64.                     file_list.append(os.path.join(file[0],filename))
  65.         return file_list

  66.     def find_files(self, path):
  67.         """
  68.         遍历路径下的所有文件,但不包括空目录
  69.         :param path: 需要遍历的路径
  70.         :return:
  71.         """
  72.         files = os.walk(path)
  73.         files_list = []
  74.         for file in files:
  75.             if file[0] != []:
  76.                 for filename in file[2]:
  77.                     files_list.append(os.path.join(file[0],filename))
  78.         return files_list

  79.     def find_filename(self,path,filename):
  80.         """
  81.         查找你指定目录下,文件名为filename的文件
  82.         filename必须包含文件类型
  83.         :param path:
  84.         :param filename:必须包含类型
  85.         :return:
  86.         """
  87.         file_list = []
  88.         if os.path.isfile(path):
  89.             files = [path]
  90.         else:
  91.             files = self.find_files(path)
  92.         for file in files:
  93.             if filename == os.path.basename(file):
  94.                 file_list.append(file)
  95.         return file_list

  96.     def find_filetype(self, path, types):
  97.         """
  98.         查找目录下所有指定的文件类型
  99.         :param path:
  100.         :param types: 需要查找的类型。目前只支持单类型查找
  101.         :return:
  102.         """
  103.         file_list = []
  104.         if os.path.isfile(path):
  105.             files = [path]
  106.         else:
  107.             files = self.find_files(path)
  108.         for file in files:
  109.             if types in os.path.splitext(file)[1]:
  110.                 file_list.append(file)
  111.         return file_list

  112.     def find_filetext(self,filelist,text):
  113.         """
  114.         查询文件列表中的所有文件,如果文件中包含txt的内容,则返回文件名
  115.         :param filelist:需要查找内容的文件列表
  116.         :param text:
  117.         :return:
  118.         """
  119.         file_list = []
  120.         for file in filelist:
  121.             with open(file,'r') as f:
  122.                 if text in f.read():
  123.                     file_list.append(file)
  124.         return file_list

  125.     def find_size(self,filelist,compares,num):
  126.         """
  127.         根据输入的符号是<,>;以及num,返回指定的文件名
  128.         :param filelist:
  129.         :param compare:比较符
  130.         :param num:字符数
  131.         :return:
  132.         """
  133.         file_list =[]
  134.         for file in filelist:
  135.             size = os.stat(file).st_size
  136.             if compares == '>'and size > num :
  137.                 file_list.append(file)
  138.             elif compares == '<' and size > num:
  139.                 file_list.append(file)
  140.         return file_list

  141.     def first_line(self,filename):
  142.         """
  143.         返回文件的非空第一行
  144.         :param filename:
  145.         :return:
  146.         """
  147.         with open(filename,'r') as f:
  148.             if f.read().lstrip() == '':
  149.                 print('空文档')
  150.                 f.close()
  151.             else:
  152.                 with open(filename,'r') as f:
  153.                     while True:
  154.                         str1 = f.readline()
  155.                         if str1.lstrip()== '':
  156.                             continue
  157.                         else:
  158.                             print(str1,end='')
  159.                             break

  160.     def copy_file(self,filename):
  161.         """
  162.         复制这个文件到初始目录 并加上.dup
  163.         :param filename:
  164.         :return:
  165.         """
  166.         shutil.copyfile(filename,filename+'.dup')

  167.     def find_mtime(self,filename):
  168.         """
  169.         查看修改文件的时间,这个时间是只读的。不知道怎么修改
  170.         :param filename:
  171.         :return:
  172.         """
  173.         info = os.stat(filename)
  174.         t = time.localtime(info.st_mtime)
  175.         return time.strftime("%Y-%m-%d %H:%M:%S",t)


  176.     def main(self):
  177.         """

  178.         :return:
  179.         """
  180.         while True:
  181.             str1 = input('请开始输入吧:')
  182.             if str1 == '!q':
  183.                 break
  184.             types = str1.split(' ')[0]

  185.             if types == 'D':
  186.                 dir = str1.split(' ')[1]
  187.                 file_list = self.find_children(dir)
  188.                 print(file_list)
  189.             elif types == 'R':
  190.                 dir = str1.split(' ')[1]
  191.                 file_list = self.find_all(dir)
  192.                 print(file_list)
  193.                 """
  194.                 所有的方法我已经写了。剩下的按照你的想法往下泄了。
  195.                 """

  196. if __name__ == '__main__':

  197.     try:
  198.         SearchFile().main()
  199.     except:
  200.         print('ERROR')
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-10 00:49:07 | 显示全部楼层

现在如果出现error,程序就结束了,怎么才能让每个error之后程序都能让用户重新输入啊。谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-10 04:04:57 | 显示全部楼层

回帖奖励 +1 鱼币

学习学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-13 21:26:16 | 显示全部楼层
本帖最后由 堕落之翼 于 2018-4-13 21:27 编辑

  1. if __name__ == '__main__':

  2.     try:
  3.         SearchFile().main()
  4.     except:
  5.         print('ERROR')
  6.         SearchFile().main()
复制代码

这样应该可以继续了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-30 19:32:35 | 显示全部楼层

回帖奖励 +1 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-28 02:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表