文件操作、面向对象(上)
一、日期和时间
1、time模块
1)time()函数获取当前时间戳
#使用time()函数首先要先引入time模块import time#获取当前时间戳,单位秒print(time.time())
运行结果
1523888609.055912
这个时间是从1970年01月01日00时00分00秒起至现在的总秒数
2)localtime([seconds])格式化时间戳为本地时间,返回时间元组
| 字段 | 属性 | 值 |
|---|---|---|
| 年 | tm_year | 2018 |
| 月 | tm_mon | 1到12 |
| 日 | tm_mday | 1到31 |
| 时 | tm_hour | 0到23 |
| 分 | tm_min | 0到59 |
| 秒 | tm_sec | 0到61(60或61是闰秒) |
| 一周的第几日 | tm_wday | 0到6(0是周一) |
| 一年的第几日 | tm_yday | 1到366,一年中的第几天 |
| 夏令时 | tm_isdst | 是否为夏令时,值为1时是夏令时,值为0时不是夏令时 |
import time#获取本地当前时间的时间元组print(time.localtime(time.time()))#将指定时间戳格式化时间元组print(time.localtime(1514739661))
运行结果
time.struct_time(tm_year=2018, tm_mon=4, tm_mday=16, tm_hour=22, tm_min=23, tm_sec=29, tm_wday=0, tm_yday=106, tm_isdst=0)time.struct_time(tm_year=2018, tm_mon=1, tm_mday=1, tm_hour=1, tm_min=1, tm_sec=1, tm_wday=0, tm_yday=1, tm_isdst=0)
3)time.strftime(format[,time_tuple]) 格式化日期函数
| 格式化符号 | 说明 |
|---|---|
| %y | 两位数的年份表示(00-99) |
| %Y | 四位数的年份表示(0000-9999) |
| %m | 月份(01-12) |
| %d | 月内中的一天(0-31) |
| %H | 24小时制小时数(0-23) |
| %I | 12小时制小时数(01-12) |
| %M | 分钟数(00-59) |
| %S | 秒(00-59) |
| %a | 本地简化星期名称 |
| %A | 本地完整星期名称 |
| %b | 本地简化的月份名称 |
| %B | 本地完整的月份名称 |
| %c | 本地相应的日期表示和时间表示 |
| %j | 年内的一天(001-366) |
| %p | 本地A.M.或P.M.的等价符 |
| %U | 一年中的星期数(00-53),星期天为星期的开始 |
| %w | 星期(0-6),星期天为星期的开始 |
| %W | 一年中的星期数(00-53),星期一为星期的开始 |
| %x | 本地相应的日期表示 |
| %X | 本地相应的时间表示 |
| %Z | 当前时区的名称 |
import time#若没有指定时间,则默认格式化当前时间元组print(time.strftime("%Y/%m/%d %H:%M:%S"))#格式化指定时间元组print(time.strftime("%Y/%m/%d %H:%M:%S",time.localtime()))
运行结果
2018/04/17 13:40:432018/04/17 13:40:43
4)time.strptime(string,format) 将日期时间字符串转换为时间元组
import timeprint(time.strptime("2018-04-17 13:40:30","%Y-%m-%d %H:%M:%S"))#前后格式要一一对应,否则会报错
运行结果
time.struct_time(tm_year=2018, tm_mon=4, tm_mday=17, tm_hour=13, tm_min=40, tm_sec=30, tm_wday=1, tm_yday=107, tm_isdst=-1)
5)time.mktime(time_tuple) 将时间元组转换成时间戳
import timeprint(time.mktime(time.strptime("2018-04-12 20:17:30","%Y-%m-%d %H:%M:%S")))
运行结果
1523535450.0
6)time.sleep(seconds) 程序睡眠等待几秒钟
import time#sleep(秒)程序睡眠时间start_time = time.time()time.sleep(5)end_time = time.time()print(end_time - start_time)
运行结果
5.009008884429932
2、datetime模块
1)datetime.datetime.now() 获取当前日期和时间
import datetime #要先引入datetime模块print(datetime.datetime.now())
运行结果
2018-04-17 13:43:13.484118
2)strftime(format) 日期时间格式化
import datetimeprint(datetime.datetime.now().strftime("%Y/%m/%d %H:%M:%S"))
运行结果
2018/04/17 13:43:36
3)datetime.datetime.fromtimestamp(timestamp) 将时间戳转换为日期时间
import timeimport datetimet = time.time() #获取当前时间戳print(t)print(datetime.datetime.fromtimestamp(t))
运行结果
1523943852.47979662018-04-17 13:44:12.479797
4)datetime.timedelta(时间间隔) 返回一个时间间隔对象,通过时间间隔可以对时间进行加减法得到新的时间
import datetime#计算昨天的日期today = datetime.datetime.today()print(today.strftime("%Y-%m-%d %H:%M:%S"))timedelta = datetime.timedelta(days=1) #时间间隔为1天yesterday = today - timedeltaprint(yesterday.strftime("%Y-%m-%d %H:%M:%S"))
运行结果
2018-04-17 13:45:072018-04-16 13:45:07
二、文件与文件夹操作
1、文件操作
要先引入os模块
1)open方法打开一个已存在的文件或者创建新的文件。
open(文件路径,访问模式,encoding=编码格式)
2)close()方法关闭已打开的文件
切记打开的文件最后要关闭
3)打开文件常用的三种访问模式
r:只读模式(默认)
w:只写模式
a:追加模式
import os#要先引入os模块#"r":文件不存在则报错f = open("test.txt","r")f.close()
由于之前没有test.txt,上面这段程序会报错
import os#"w":文件不存在则创建f = open("test.txt","w",encoding="utf-8") #覆盖已存在的内容,encoding="utf-8"解决中文乱码f.write("你好")f.close()
运行结果
test.txt
你好
4)write(data)方法向文件中写入字符串
import osf = open("test.txt","a",encoding="utf-8") #"a":在已存在的内容后面追加,encoding="utf-8"解决中文乱码f.write("\n大家好")f.close()
运行结果
test.txt
你好大家好
5)read()方法读取文件的全部内容
import osf = open("test.txt","r",encoding="utf-8")print(f.read())f.close()
运行结果
你好大家好
6)readlines()方法读取文件全部内容,放回一个列表,每行数据是列表中的一个元素
import osf = open("test.txt","r",encoding="utf-8")data = f.readlines()print(data)print("-----------")i = 1for line in data:print("第{}行:{}".format(i,line),end="")i += 1f.close()
运行结果
['你好\n', '大家好']-----------第1行:你好第2行:大家好
7)readline()方法按行读取文件数据
import osf = open("test.txt","r",encoding="utf-8")line1 = f.readline()print(line1,end="")line2 = f.readline()print(line2,end="")f.close()
运行结果
你好大家好
8)writelines(字符串序列)将一个字符串序列(如字符串列表等)的元素写入到文件中
import osf = open("test.txt","w",encoding="utf-8")f.writelines(["张三\n","李四\n","王五\n"])f.close()
9)os.rename(oldname,newname)文件重命名
import osos.rename("d://test.txt","d://123.txt") #文件路径要相同,即前后为同一个文件
10)os.remove(filepath)删除文件
import osos.remove("d://test.txt")
11)安全的打开关闭文件的方式(自动调用close方法)
import oswith open("d://test.txt","w") as f:f.write("hello python")
在使用with构造一个对象后,会调用这个对象的enter方法,with语句块执行结束后,会自动调用exit方法。对于open构造的对象,就是自动调用close了
2、文件夹操作
1)os.mkdir(path) 创建文件夹
import osos.mkdir("d://testdir")
2)os.getcwd() 获取程序运行的当前目录
import osprint(os.getcwd())
运行结果
D:\PycharmProjects\Lesson05
3)os.listdir(path) 获取指定目录下的文件列表
import osprint(os.listdir("d://"))
4)os.rmdir(path) 删除空文件夹
import osos.rmdir("d://testdir")
只能删除空文件夹,否则会报错
5)shutil.rmtree(path) 删除非空文件夹
import shutil #要先引入shutil模块shutil.rmtree("d://testdir")
6)os.chdir(path) 切换目录
import ospath = os.getcwd() #程序运行的当前路径print(path)os.chdir("../") #切换到上一级目录path = os.getcwd()print(path)os.chdir("d://") #切换到上一级目录path = os.getcwd()print(path)
运行结果
D:\PycharmProjects\Lesson05D:\PycharmProjectsd:\
三、JSON格式文件操作
要先引入json模块:import json
1)dumps(python_data):将Python数据转换为JSON编码的字符串
2)loads(json_data):将JSON编码的字符串转换为Python的数据结构
import jsonjson_dict = {"name":"zhangsan","age":20,"language":["python","java"],"study":{"AI":"python","bigdata":"hadoop"},"if_vip":True}json_str = json.dumps(json_dict)print(json_str)print(type(json_str))python_data = json.loads(json_str)print(python_data)print(type(python_data))
运行结果
{"name": "zhangsan", "age": 20, "language": ["python", "java"], "study": {"AI": "python", "bigdata": "hadoop"}, "if_vip": true}<class 'str'>{'name': 'zhangsan', 'age': 20, 'language': ['python', 'java'], 'study': {'AI': 'python', 'bigdata': 'hadoop'}, 'if_vip': True}<class 'dict'>
3)dump(python_data,file):将Python数据转换为JSON编码的字符串,并写入文件
4)load(json_file):从JSON数据文件中读取数据,并将JSON编码的字符串转换为Python的数据结构
import jsonjson_dict = {"name":"zhangsan","age":20,"language":["python","java"],"study":{"AI":"python","bigdata":"hadoop"},"if_vip":True}# 写入文件with open("d://user_info.json","w") as f:json.dump(json_dict,f)# 读取文件with open("d://user_info.json","r") as f:user_info_data = json.load(f)print(user_info_data)print(type(user_info_data))
运行结果
{'name': 'zhangsan', 'age': 20, 'language': ['python', 'java'], 'study': {'AI': 'python', 'bigdata': 'hadoop'}, 'if_vip': True}<class 'dict'>
Python数据类型与JSON类型对比
| Python | JSON |
|---|---|
| dict | { } |
| list,tuple | [ ] |
| str | string |
| int 或者float | number |
| True/False | true/false |
| none | null |
四、CSV格式文件操作
要先引入csv模块:import csv
csv格式文件默认以逗号分隔
1)writerow([row_data]):一次写入一行数据
2)writerows([row_data1],[row_data2],[row_data3],…):一次写入多行数据
#向csv文件写数据import csvdatas = [["name","age"],["张三",20],["lisi",30]] #第一个列表是表示csv文件的标题with open("d://user_info_csv.csv","w",newline="",encoding="utf-8") as f:writer = csv.writer(f)for row in datas:#一次写入一行writer.writerow(row)#一次写入多行writer.writerows(datas)
3)reader(file_object):根据打开的文件对象返回一个可迭代reader对象
4)可以使用next(reader)遍历(reader)对象,获取每一行数据
#从csv文件读数据import csvwith open("d://user_info_csv.csv","r",newline="",encoding="utf-8") as f: #如果不指定newline="",则每写入一行将有一空行被写入reader = csv.reader(f) #reader可迭代对象header = next(reader) #读一行数据,读取后下面的reader中就没有这一行了print(header)print("------------")for row in reader:print(row)print(row[0])print(row[1])
运行结果
['name', 'age']------------['张三', '20']张三20['lisi', '30']lisi30['name', 'age']nameage['张三', '20']张三20['lisi', '30']lisi30
由于之前在写入时使用writerow与writerows方法各写入一遍,因此调用的csv文件中有6行数据
5)DictWriter和DictReader对象处理Python字典类型的数据
import csvheader = ["name","age"]rows = [{"name":"zhangsan","age":20},{"name":"lisi","age":30},{"name":"wangwu","age":18}]#写入数据with open("d://user_info_csv_dict.csv","w",newline="",encoding="utf-8") as f:writer = csv.DictWriter(f,header)writer.writeheader()writer.writerows(rows)#读取数据with open("d://user_info_csv_dict.csv","r",newline="",encoding="utf-8") as f:reader = csv.DictReader(f)for row in reader:print(row)print("name:{},age:{}".format(row["name"],row["age"]))
运行结果
OrderedDict([('name', 'zhangsan'), ('age', '20')])name:zhangsan,age:20OrderedDict([('name', 'lisi'), ('age', '30')])name:lisi,age:30OrderedDict([('name', 'wangwu'), ('age', '18')])name:wangwu,age:18
五、面向对象编程
面向对象编程(简称OOP):是一种解决软件复用的设计和编程方法。这种方法把软件系统中相似的操作逻辑、数据、状态等以类的形式描述出来,通过对象实例在软件系统中复用,从而提高软件开发效率。
1、类的定义
1)类:一个事物的抽象,定义了一类事物的属性和行为
2)类的构成:类的名称、类的属性、类的方法
3)类的定义
class 类名:def 方法名(self[,参数列表])
类名的命名规则按照“大驼峰”
定义的方法默认要传入一个self参数,表示自己,self参数必须是第一个参数
#定义类class Dog:def eat(self):print("小狗正在啃骨头...")def drink(self):print("小狗正在喝水...")
2、创建对象及对象的使用
1)对象:通过类创建的一个具体事物,它具有状态和行为,可以做具体的事情
2)类与对象的关系:类相当于创建对象的模板,根据类可以创建多个对象
3)创建对象:
对象变量名 = 类名()
# 创建对象wang_cai = Dog()print(id(wang_cai))wang_cai.eat()wang_cai.drink()# 一个类可以创建多个对象a_fu = Dog()print(id(a_fu))a_fu.eat()a_fu.drink()
运行结果
31367800小狗正在啃骨头...小狗正在喝水...35598856小狗正在啃骨头...小狗正在喝水...
