您的位置:首页 > 编程语言 > Python开发

零基础学习Python 作业 第30章

2018-03-27 12:06 309 查看
============ CH30 homework ============

0 编写一个程序,统计当前目录下每个文件类型的文件数,程序实现如图:

>>>
该文件夹下共有类型为[.txt]的文件 1 个
该文件夹下共有类型为[.png]的文件 2 个
该文件夹下共有类型为[.py]的文件 3 个
该文件夹下共有类型为[.docx]的文件 2 个
该文件夹下共有类型为[文件夹]的文件 2 个


code

import os

# 1 判断一个路径(目录或文件)是否存在
# b = os.path.exists('Your path')
#
# 2 判断一个路径是否是文件
# b = os.path.isfile('Your path')
#
# 3 判断一个路径是否目录
# b = os.path.isdir('Your path')
#
# 4获取某目录中的文件及子目录的列表
# L = os.listdir('Your path')
#
# 4 e.g
#
# def getDirList( p ):
#   p = str( p )
#   if p == '':
#       return []
#   p = p.replace('/', '\\')
#   if p[-1] != '\\':
#       p = p + '\\'
#   a.os.listdir(p)
#   b = [x for x in a if os.path.isdir(p+x)]
#   return b
# print getDirList('D:\\')
#
# def getFileList( p ):
#     p = str( p )
#     if p=="":
#         return [ ]
#     p = p.replace( "/","\\")
#     if p[ -1] != "\\":
#         p = p+"\\"
#     a = os.listdir( p )
#     b = [ x   for x in a if os.path.isfile( p + x ) ]
#     return b
# print   getFileList( "C:\\" )
#
# 5 创建子目录
# os.makedirs( path )
#
# 6 删除子目录
# os.rmdir( path )
#
# 7 文件改名
# os.name(oldfileName, newFilename)
#
# Python 字典 setdefault() 函数和get() 方法类似
# dict.setdefault(key, default=None)

# os.listdir(os.curdir)
all_files = os.listdir('D:\\Learn\\Python project\\CH30 homework')
type_dict = dict()

for each_file in all_files:
if os.path.isdir(each_file):
# 如果类型字典中没有,则添加Key并设置默认值为0
type_dict.setdefault('文件夹', 0)
type_dict['文件夹'] += 1
else:
ext = each_file.split('.')[1]
# ext = os.path.splitext(each_file)[1]
type_dict.setdefault(ext, 0)
type_dict[ext] += 1

for each_type in type_dict.keys():
print('该文件夹下共有类型[.%s]的文件 %d 个' % (each_type, type_dict[each_type]))
# print('该文件夹下共有类型[%s]的文件 %d 个' % (each_type, type_dict[each_type]))

# Result

该文件夹下共有类型[.pkl]的文件 1 个
该文件夹下共有类型[.md]的文件 2 个
该文件夹下共有类型[.py]的文件 2 个
>>>


1 编写一个程序,计算当前文件夹下所有文件的大小,程序实现如下图:

>>>
0.png [8450Bytes]
vedioList.txt [503Bytes]
2.png [6791Bytes]


import os

# os.path.getsize()
# os.curdir 代指当前目录

all_files = os.listdir(os.curdir)
file_dict = dict()

for each_file in all_files:
# os.path.isfile() 判断文件夹中的内容是否是文件
if os.path.isfile(each_file):
# 计算文件大小
file_size = os.path.getsize(each_file)
file_dict[each_file] = file_size

# python字典的items方法作用:是可以将字典中的所有项,以列表方式返回。如果对字典项的概念不理解,可以查看Python映射类型字典基础知识一文。因为字典是无序的,所以用items方法返回字典的所有项,也是没有顺序的。
for each in file_dict.items():
print('%s [%dBytes]' % (each[0], int(each[1])))

# Result
my_list.pkl [57Bytes]
suffixSum.py [1775Bytes]
test.py [272Bytes]
note.md [308Bytes]
computeFileSize.py [682Bytes]
homework.md [2582Bytes]


2 编写一个程序,用户输入文件名以及开始搜索的路径,搜索该文件是否存在。如果遇到文件夹,则进入文件夹继续搜索,程序实现如下图:

>>>
请输入待查找的初始目录: E:\\TestFolder
请输入需要查找的文件名: 测试3.txt
E:\TestFolder\SubFolder1\测试3.txt
E:\TestFolder\SubFolder2\测试3.txt
>>>


code

import os

def search_file(file_path, file_name):
# 改变当前工作目录到指定的路径file_path
os.chdir(file_path)
allfile = os.listdir(os.curdir)

for each_file in allfile:
if each_file == file_name:
# os.getcwd() 获取当前each_file的路径
# os.sep() 可以取代操作系统特定的路径分割符
print(os.getcwd() + os.sep + each_file)
if os.path.isdir(each_file):
search_file(each_file, file_name)
# os.chdir() 改变当前目录为新的目录
# os.pardir() windows中指切换到上一级目录
os.chdir(os.pardir)

file_path = input('请输入待查找的初始目录: ')
while not os.path.exists(file_path):
print('目录不存在!')
file_path = input('请输入待查找的初始目录: ')

file_name  = input('请输入需要查找的目标文件: ')

search_file(file_path, file_name)

#Result
请输入待查找的初始目录: D:\Learn
请输入需要查找的目标文件: homework.md
D:\Learn\Python project\CH10 homework\homework.md
D:\Learn\Python project\CH11-12 homework\homework.md
D:\Learn\Python project\CH13 homework\homework.md
D:\Learn\Python project\CH14 homework\homework.md
D:\Learn\Python project\CH15 homework\homework.md
D:\Learn\Python project\CH16 homework\homework.md
D:\Learn\Python project\CH17 homework\homework.md
D:\Learn\Python project\CH18 homework\homework.md
D:\Learn\Python project\CH19 homework\homework.md
D:\Learn\Python project\CH20 homework\homework.md
D:\Learn\Python project\CH21 homework\homework.md
D:\Learn\Python project\CH22 homework\homework.md
D:\Learn\Python project\CH23-24 homework\homework.md
D:\Learn\Python project\CH25 homework\homework.md
D:\Learn\Python project\CH26 homework\homework.md
D:\Learn\Python project\CH27 homework\homework.md
D:\Learn\Python project\CH28 homework\homework.md
D:\Learn\Python project\CH29 homework\homework.md
D:\Learn\Python project\CH30 homework\homework.md
>>>


3 编写一个程序,用户输入开始搜索路径,查找该路径下(包含子文件夹)所有视频格式文件(要求查找mp4,rmvb,avi的格式即可),并把创建一个文件(vedioList.txt)存放所有找到的文件路径,程序实现如下图:

>>>
请输入待查找的初始目录: J:\\OL系列
--------------------------------------
J:\OL系列\xxx.avi
--------------------------------------


code

import os

def videoCount(file_path, target):
os.chdir(file_path)
allfile = os.listdir(os.curdir)

for each_file in allfile:
ext = os.path.splitext(each_file)[1]
if ext in target:
# os.linesep:给出当前平台的行终止符
video_list.append(os.getcwd() + os.sep + each_file + os.linesep)
if os.path.isdir(each_file):
videoCount(each_file, target)
os.chdir(os.pardir)

file_path = input('请输入待查找的初始目录: ')
while not os.path.exists(file_path):
print('目录不存在!')
file_path = input('请输入待查找的初始目录: ')

program_dir = os.getcwd()
target = ['.avi', '.mp4', '.rmvb']
video_list = []

videoCount(file_path, target)

f = open(program_dir + os.sep + 'videolist.txt', 'w')
f.writelines(video_list)
f.close()


4 编写一个程序,用户输入关键字,查找当前文件夹内(如果当前文件夹内包含文件夹,则进入文件夹继续搜索)所有含有该关键字的文本文件(.txt),要求显示该文件所在位置及关键字在文件中的具体位置(第几行第几个字符),程序实现如下图所示:

>>>
请将该脚本放于待查找的文件夹内,请输入关键字: 小甲鱼
请问是否需要打印关键字[小甲鱼]在文件中的具体位置(YES/NO): yes
======================================================
在文件[E:\TestFolder\test.txt]中找到关键字: [小甲鱼]
关键字出现在第13行,第[3,10,18]位置


code

import os

def print_pos(key_dict):
keys = key_dict.keys()
# 因为字典是无序的,所以这里需要重新排序
keys = sorted(keys)
for each_key in keys:
print('关键字出现在第 %s 行,第 %s 位置!' % (each_key, str(key_dict[each_key])))

def pos_in_line(line, key):
pos = []
begin = line.find(key)
while begin != -1:
pos.append(begin + 1)
begin = line.find(key, begin + 1)

return pos

def search_in_file(file_name, key):
f = open(file_name)
count = 0
key_dict = dict()

for each_line in f:
count += 1
if key in each_line:
# 统计行中的具体位置
pos = pos_in_line(each_line, key)
# count 为对应的行号作为关键字
key_dict[count] = pos

f.close()
return key_dict

def search_files(key, detail):
# os.walk(top[, topdown=True[, onerror=None[, followlinks=False]]])
# top -- 根目录下的每一个文件夹(包含它自己), 产生3-元组 (dirpath, dirnames, filenames)【文件夹路径, 文件夹名字, 文件名】。
# topdown --可选,为True或者没有指定, 一个目录的的3-元组将比它的任何子文件夹的3-元组先产生 (目录自上而下)。如果topdown为 False, 一个目录的3-元组将比它的任何子文件夹的3-元组后产生 (目录自下而上)。
# onerror -- 可选,是一个函数; 它调用时有一个参数, 一个OSError实例。报告这错误后,继续walk,或者抛出exception终止walk。
# followlinks -- 设置为 true,则通过软链接访问目录。
all_files = os.walk(os.getcwd())
# 设置一个列表存储.txt的路径
txt_files = []

for i in all_files:
# i[0] dirpath, i[1] dirnames, i[2] filenames
for each_file in i[2]:
if os.path.splitext(each_file)[1] == '.txt':
txt_files.append(each_file)

for each_txt_file in txt_files:
key_dict = search_in_file(each_txt_file, key)
if key_dict:
print('=======================================================')
print('在文件[%s]中找到关键字[%s]!' % (each_txt_file, key))
if detail in ['YES', 'Yes', 'yes', 'Y', 'y']:
print_pos(key_dict)

key = input('请将脚本放于待查找的文件夹内,请输入关键字: ')
detail = input('请问是否需要打印关键字[%s]在文件中的具体位置(YES/NO): ' % key)
search_files(key, detail)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息