Python 每日一练(2)

引言

  • 我又双叒叕的来啦,新博客的第二篇文章,这次是继之前公众号上每日一练的第二个,这次是专题实对于文件的一些处理的练习
  • 主要有以下几类:
    1、实现英文文章字频统计
    2、统一剪裁某一指定目录下的所有图片的分辨率
    3、代码行数统计(包括注释行数、空行数、代码总行数)

字频统计

  • 这里我是参考的《Python变成快速上手--让繁琐工资自动化》中的一种写法,采用字典的setdefault函数实现了单词出现次数的记录,这里简要讲解一下这个方法:
  • setdefault()这个方法有两个参数,第一个是字典的某个键,第二个是如果这个键值不存在的话,设置的默认值,这个方法的作用很好的帮我们解决了,对于想设置字典中不存在的键值时的问题
  • 下面来简要分析一下解决这个问题的大致思路,首先要有一个用于存放统计数据的空字典,其次要给它里面的键设置默认值,因为一开始没有任何键值,所以这里用setdefault()就能解决了
  • 代码示例:
#-*- coding:utf-8 -*-
# Author:Konmu
# 任一个英文的纯文本文件,统计其中的单词出现的个数。

import re
f=open('C:/xxxx.txt','r')
data=f.read()

punctuations=r'["!,.?"]+'
'''
由于英文文章中也还是包含有标点,但是在后续分割时会发现由于标点和单词之间并没有空格所以也会被当作
单词的一部分,这是我们所不希望的,所以要先设立要去除的标点
'''
data=re.sub(punctuations,'',data)
data=data.split(' ')     
#通常我们写英文作文时都会有的习惯,每个单词之间使用
#空格分开,所以可以根据此将每个单词分割开来
count={}
total=0

for alpha in data:
    count.setdefault(alpha,0)
    count[alpha] = count[alpha] + 1

for i in count:
    total+=count[i]

print('each words:'+'
',count)
print('total_number:'+'
',total)

分辨率设置

  • 当我们在使用一些图片的时候,可能会遇到图片分辨率和屏幕不适配的问题,这时就要想办法批量设置这些图片的分辨率
  • 解决这个问题用到的还是之前的PIL库的函数thumbnail(),此函数是制作当前图片的缩略图, 参数size指定了图片的最大的宽度和高度,其接收的参数是一个二元元组(x,y)分别指定缩略图的宽高
  • 代码示例:
#-*- coding:utf-8 -*-
# Author:Konmu
# 你有一个目录,装了很多照片,把它们的尺寸变成指定分辨率的大小。
import os
from PIL import Image

file_path='C:/xxx'
image_file=os.listdir(file_path)
save_path='C:/xxx/output{}.jpg'
count=0

for i in image_file:
    im=Image.open(file_path+i)
    im.thumbnail((1136,640))#关键的缩略图裁剪函数
    for j in range(len(image_file)):
        count+=1
        im.save(save_path.format(count))
        break

代码行数统计

  • 由于我习惯直接用IDLE编写python,然而它本身并不带有自动的代码行数记录,所以这个代码练习可以实现最简单的代码行数记录。
  • 这里有几个地方要注意的,对于注释行,我是通过判断注释符"#"是否在行中进行的判断记录,对于空白行,是直接利用isspace()函数可以直接解决,而所有的代码行统计直接记录打开文件的长度就解决啦,是不是很简单呢,O(∩_∩)O
  • 代码示例:
# -*- coding:utf-8 -*-
# Author : 代码字数统计
# 每日一练:第 0007 题: 有个目录,里面是你自己写过的程序,
# 统计一下你写过多少行代码。包括空行和注释,但是要分别列出来。

num_empty=0
num_note=0

f=open('C:/xxx.py','r',encoding ='utf-8')

data=f.readlines()#读取文件所有内容
count = len(data)
print('Total count of Codes: ',count)

pattern1='#' #匹配注释符,用于统计注释

for i in range(count):
    if(pattern1 in data[i]):
        num_note += 1
    elif(data[i].isspace()):#匹配空行
        num_empty += 1
    else:
        pass

print('num_note: ', num_note)
print('num_empty: ',num_empty)
f.close()

  • 几个注意点:
    1、对于readlines的讲解:由于这个函数是直接读取所有的文件内容,所以一般不对大文件进行操作,若要是处理大文件可以考虑换用readline()函数
    2、当文件中含有中文字符时,读取文件要加上encoding参数,encoding='utf-8'

总结

  • 这次的几个练习,对于文件的操作有了更进一步的掌握,其中有些功能的实现,在编写时还是有些繁杂,后续还可以进一步完善,以实现更丰富的功能
原文地址:https://www.cnblogs.com/Konmu/p/12512884.html