python模块文件操作调试

文章介绍了Python中的PIL模块用于图像处理的基础操作,包括打开、保存、转换图像等。接着讨论了时间相关的模块,如time和datetime,展示了如何获取和格式化时间,以及获取日历信息。在文件操作部分,讲解了文件的打开、关闭、读写、定位、重命名和删除。此外,还提到了文件夹操作和调试程序的方法,如批量修改文件名、使用print、assert、logging和pdb进行调试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.图像处理PIL模块

Image模块
Image模块是在Python PIL图像处理中常见的模块,对图像进行基础操作的功能基本都包含于此模块内。如open、save、conver、show…等功能。

convert:
将当前图像转换为其他模式,并且返回新的图像。

Mode
图像的模式,常见的mode 有 “L” (luminance) 表示灰度图像,“RGB”表示真彩色图像,和 “CMYK” 表示出版图像,表明图像所使用像素格式。如下表为常见的nodes描述:
modes描述
11位像素,黑和白,存成8位的像素
L8位像素,黑白
P8位像素,使用调色板映射到任何其他模式
RGB3× 8位像素,真彩
RGBA4×8位像素,真彩+透明通道
CMYK4×8位像素,颜色隔离
YCbCr3×8位像素,彩色视频格式
I32位整型像素
F32位浮点型像素
from PIL import Image
img = Image.open(r'1.jpg')
#获取图片类型,大小
print(img.format,img.size)
#保存图片
img.save('2.png')
#生成缩略图  里面参数是宽和高
img.thumbnail((100,200))
#图片转换
img2 = img.convert('F')
#显示图片
img.show()
img2.show()

二.时间相关的模块(熟练使用)

1.在python中表示时间的方式:

1.时间戳(timestamp):时间戳表示的是从1970年1月1日00:00:00,按秒计算偏移量
clock(),time()

格式化的时间字符串(了解)

字符串含义
%a本地简化的星期的名称
%A完整的星期的名称
%b简化的月份的名称
%B完整的月份的名称
%c本地对应的日期表示和时间表示
%d月内中的天数(0~31)
%H24小时制小时数(0~23)
%m月份(01~12)
%M分钟数(00~59)
%w星期(0~6) 星期天开始

元组:共有9中元素,返回的是struct_time的函数主要有gmtime(),localtime(),strptime()

索引属性
0tm_year(年)2018
1tm_mon(月)1~12
2tm_mday(日)0~31
3tm_hour(时)0~23
4tm_min(分钟)0~59
5tm_sec(秒)0~61
6tm_wday(weekday)0~6(0表示周日)
7tm_yday(一年中的第几天)1~366
8tm_isdst(是否是夏令时)默认为-1

UTC :世界协调时间 】格林威治天文时间,世界标准时间
在中国UTC+8

#localtime():获取当前时间,返回struct_time格式返回
#获取当前的时间

import time
#1.time获取当前时间戳  使用场景:数据库存储时间一般整形
curtime = time.time()
print(curtime)
strtime = time.ctime()
print(strtime)

#格式化时间
t = time.strftime('%Y/%m/%d %H:%M:%S')
print(t)

#localtime返回当前元祖格式时间
local = time.localtime()
print(local)
print(local.tm_year,'-',local.tm_mon,'-',local.tm_mday,local.tm_hour)

#让程序睡一会 sleep()
print('1111')
time.sleep(3)
print('2222')

2.datetime

#获取当天的时间
now = datetime.datetime.now()
print(now)

#获取当前的日期
today = datetime.date.today()
print(today)

#案例.获取昨天的时间
def getYesDay():
    #获取当天的时间
    today = datetime.date.today()
    #获取前一天的时间
    oneday = datetime.timedelta(days=1)
    yes = today - oneday
    print(yes)
#调用函数
getYesDay()

3.获取日历相关的信息

#获取某个月的日历
# 格式:calendar.month(x,y)
#x:显示的年份
#y显示的月份
print(calendar.month(2019,11))

#设置日历的第一天
calendar.setfirstweekday(calendar.SUNDAY)
print(calendar.month(2019,11))

#获取某一年的日历:
# 格式:calendar.calendar(x)
#x:显示的年份
print(calendar.calendar(2019))

#打印出一个月日历
res = calendar.HTMLCalendar(calendar.SUNDAY)
print(res.formatmonth(2019,5))

#判断某年是否为闰年?
print(calendar.isleap(2019))
print(calendar.isleap(2020))

三.文件的操作

1.文件的打开

访问模式说明
w打开一个文件只用于写入,如果该文件已经存在则将其覆盖,如果不存在,创建新文件
r以只读的方式打开一个文件,文件的指针将会在文件的开头位置,默认模式,如果文件不存在会报错
a打开一个文件用于追加,如果该文件已经存在,文件的指针会放在文件的结尾,即新的内容将会写入已有内容之后,如果文件不存在,如果文件不存在,创建一个新文件进行写入
r+打开一个文件用于读写,文件的指针放在文件的开头位置
w+打开一个文件用于读写,如果该文件已经存在将其覆盖,如果文件不存在,创建一个新文件
a+打开一个文件用于读写,文件的指针放在文件的末尾位置,,即新的内容将会写入已有内容之后,如果文件不存在,如果文件不存在,创建以一个新文件进行写入
rb以二进制的方式打开一个文件用于只读,文件的指针将会在文件的开头位置,默认模式,如果文件不存在会报错
wb以二进制的格式打开一个文件只用于写入,如果该文件已经存在则将其覆盖,如果不存在,创建新文件
ab以二进制方式打开一个文件用于追加,如果该文件已经存在,文件的指针会放在文件的结尾,即新的内容将会写入已有内容之后,如果文件不存在,如果文件不存在,创建以一个新文件进行写入
rb+以二进制的方式打开一个文件用于读写,文件的指针放在文件的开头位置
wb+以二进制的方式打开一个文件用于读写,如果该文件已经存在将其覆盖,如果文件不存在,创建一个新文件
ab+以二进制的方式打开一个文件用于读写,文件的指针放在文件的末尾位置,,即新的内容将会写入已有内容之后,如果文件不存在,如果文件不存在,创建以一个新文件进行写入

2.文件的关闭

使用函数:
close()

f = open("test.txt","w")
f.close()

注意:
    作用,节省内存

3.文件的读写

3.1 写数据(write)

使用write()函数可以完成对文件写入内容
格式:
   write(str)
#1.打开文件
f = open('text.txt','a')
# print(type(f))
#2.写入数据
# f.write('hello\n python\n php\n c\n vb\n asp.net\njava\nshell')
f.write('111\n333\n222')
#3.关闭文件
f.close()

w模式,将文件之前数据给清除掉,再重新写入
a模式,在文件之前字符后面继续增加写入

3.2 读取数据(read/readline/readlines)

1.read(num),如果传递参数num,读取数据的长度(单位字节),如果不传参数,读取文件所有数据

f = open('text.txt','r')
res = f.read(2)
print(res)
res2 = f.read(10)
print(res2)
#使用循环
for i in f:
    print(i)
#总结:如果读取多次,下次读取是从上次读取结束的位置开始读取

2.readline返回字符串,每次读取一行

content = f.readline()
print(content)
content2 = f.readline()
print(content2)
#使用循环
for temp in f.readline():
    print(temp)
"""
总结:每次读取一行,如果传参数,读取一行数据里面的长度
"""

3.readlines()每次读取一行内容,把每行内容当中列表里面元素,返回一个列表

content = f.readlines()
print(content)
i = 1
for temp in f.readlines():
    print(i,temp)
    i += 1

3.3 读取CSV文件

导入CSV模块  pdf   图片
import csv

def readCsv(path):
    #定义列表接受读取到的数据
    readList = []
    with open(path,'r') as re:
        read = csv.reader(re)
        for r in read:
            readList.append(r)
    return readList
#调用函数
print(readCsv(r'C:\Users\1\Desktop\csv\000002.csv'))

3.4 写入csv数据

import csv
def writeCsv(path,data):
    """
    :param path:写入数据的文件路径
    :param data: 要写入到文件里数据
    :return:
    """
    with open(path,'w') as w:
        write = csv.writer(w)
        for writeRow in data:
            write.writerow(writeRow)

#调用函数
path = 'D:\yaoming.csv'
writeCsv(path,[['1','2','3'],['4','5','6'],['7','8','9']])

3.5 文件的定位读写

定为:
   通俗的讲就是找到一个位置

1.获取当前读写文件的位置
在读取文件的过程中,如果想知道当前的位置,
可以使用函数tell()来获取,是光标开始的位置

2.定位到某一个位置
如果在读写文件的过程中,需要从另外一个位置进行操作,可以使用seek()函数
格式:
seek(offset,from)
offset:偏移量
from:方向
    0:表示文件的开头
    1:表示当前位置
    2:表示文件的末尾
#tell()函数获取读取当前的位置
f = open('text.txt','rb')
str = f.read(3)
print('读取的数据是:',str)
position = f.tell()
print('读取的位置是:',position)
str2 = f.read(5)
print('第二次读取的数据是:',str2)
position2 = f.tell()
print('第二次读取的位置是:',position2)

#seek设置读取位置 0开头 1当前位置  2文件的末尾
f.seek(1,1)
str2 = f.read(5)
print('第三次读取的数据是:',str2)
position2 = f.tell()
print('第三次读取的位置是:',position2)

如果使用r模式,只支持文件开头读取,不支持当前位置读取
可以使用rb模式 支持当前位置读取

3.6 文件的重命名

概述:
   需要对文件进行重命名操作,python中有一个模块os模块----》文件的操作
   有一个函数rename()可以完成对文件名的重新命名

格式:
rename(需要修改的文件名,新的文件名)
import os
# os.rename("test.txt","毕业论文.txt")

3.7 文件的删除(pass)

概述:
   os模块中remove()可以完成对文件的删除操作
   
   格式:
      remove(待删除的文件名)
   
   案例:
  os.remove("毕业论文.txt")

四.文件夹的相关操作

1. 创建一个文件夹

概述:
    使用os模块中mkdir()函数
    
 格式:
 mkdir(待创建的文件名)

案例:
import os
os.mkdir("张三")

2.获取当前的目录下所有文件

概述:
   使用os模块中listdir()函数
   
格式:
  listdir()
  
案例:
import os
print(os.listdir("./"))

3.删除文件夹

概述:
   使用os模块中的rmdir()函数
   
 格式:
     rmdir(待删除的文件夹)  

案例:
import os
os.rmdir("张三")

4.应用----批量修改文件名(重命名)

例如:网上批量下载电视剧,电视剧名称比较长,我想批量修改剧名

五.调试程序

理解:	当我们程序出现问题的时候,我们的解决方案该怎么去写

1.打印

def test(s):
    n = int(s)
    try:
        print('>>>n=%d'%n)
        return 10/n  #n的值可能是0
        print('>>>n=%d' % n)
    except Exception as e:  #打印错误描述的信息
        print('原因是:',e)
def main():
    test('1')
#调用函数
main()
print最大的坏处:调试完之后要删除
如果调试程序代码比较多,程序文件里会出现大量print,不安全
运行程序会产生垃圾数据

2.断言 assert

格式:assert expression
等价于:
if not expression:
    raise AssertError
def test(s):
    n = int(s)
    assert n != 0,'0 is zero'
    return 10/n
#调用函数
test('0')

n = 1
assert n != 0,'0 is zero'

assert isinstance('hello',str)
assert isinstance('hello',int)
assert 表达式 n!=0 应该返回True
它和print比较相似,不同之处会有一个打印提示信息
如果assert断言失败,程序本身也会抛出一个异常AssertionError

3.logging

把print替换logging,和assert相比,logging不会出现异常,而且可以输出到文件

模块
导入logging模块
import logging
import os
dir = 'log'
if dir not in os.listdir('./'):
    os.mkdir(dir)

#添加一个配置
logging.basicConfig(level=logging.DEBUG,#控制台打印的日志级别
                    filename='./log/new.log',
                    filemode='a',##模式,有w和a,w就是写模式,每次都会重新写日志,覆盖之前的日志
                    #a是追加模式,默认如果不写的话,就是追加模式
                    format=
                    '%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s'
                    #日志格式
                    )
s = '0'
n = int(s)
logging.info('n=%d'%n)
print(10/n)
总结:logging可以指定记录信息的级别 debug,info,wranning,error
如果指定info,debug不再起作用,如果指定wranning,debug,info不起作用

4.pdb

pdb是python中自带的模块
作用:
    为python程序提供一种交互的源代码调试功能

模块
导入pdb模块

#案例:求两个数之和
import pdb
#求两个数之和
def add(a,b):
    return a + b
def cal(a,b):
    pdb.set_trace()  #在可能出现错误的代码加上 程序执行到这里自动暂停进入调试环境
    c = add(a, b)
    print(c)
#调用函数
cal(3,6)
启动pdb方式:
   DOS--->当前目录---》python -m pdb XXX.py
   直接在pycharm中导入运行
命令用途
break 或则 b设置断点
continue/c继续执行程序,或者跳到下一个断点
next/n执行下一行
step/s进入函数
list/l查看当前的代码段
return/r执行代码直到从当前函数的返回
exit/q终止,退出
p/!打印变量的值 p c
help/h帮助
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值