文件操作、面向对象(上)

一、日期和时间

1、time模块

1)time()函数获取当前时间戳

  1. #使用time()函数首先要先引入time模块
  2. import time
  3. #获取当前时间戳,单位秒
  4. print(time.time())

运行结果

  1. 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时不是夏令时
  1. import time
  2. #获取本地当前时间的时间元组
  3. print(time.localtime(time.time()))
  4. #将指定时间戳格式化时间元组
  5. print(time.localtime(1514739661))

运行结果

  1. 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)
  2. 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 当前时区的名称
  1. import time
  2. #若没有指定时间,则默认格式化当前时间元组
  3. print(time.strftime("%Y/%m/%d %H:%M:%S"))
  4. #格式化指定时间元组
  5. print(time.strftime("%Y/%m/%d %H:%M:%S",time.localtime()))

运行结果

  1. 2018/04/17 13:40:43
  2. 2018/04/17 13:40:43

4)time.strptime(string,format) 将日期时间字符串转换为时间元组

  1. import time
  2. print(time.strptime("2018-04-17 13:40:30","%Y-%m-%d %H:%M:%S"))
  3. #前后格式要一一对应,否则会报错

运行结果

  1. 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) 将时间元组转换成时间戳

  1. import time
  2. print(time.mktime(time.strptime("2018-04-12 20:17:30","%Y-%m-%d %H:%M:%S")))

运行结果

  1. 1523535450.0

6)time.sleep(seconds) 程序睡眠等待几秒钟

  1. import time
  2. #sleep(秒)程序睡眠时间
  3. start_time = time.time()
  4. time.sleep(5)
  5. end_time = time.time()
  6. print(end_time - start_time)

运行结果

  1. 5.009008884429932

2、datetime模块

1)datetime.datetime.now() 获取当前日期和时间

  1. import datetime #要先引入datetime模块
  2. print(datetime.datetime.now())

运行结果

  1. 2018-04-17 13:43:13.484118

2)strftime(format) 日期时间格式化

  1. import datetime
  2. print(datetime.datetime.now().strftime("%Y/%m/%d %H:%M:%S"))

运行结果

  1. 2018/04/17 13:43:36

3)datetime.datetime.fromtimestamp(timestamp) 将时间戳转换为日期时间

  1. import time
  2. import datetime
  3. t = time.time() #获取当前时间戳
  4. print(t)
  5. print(datetime.datetime.fromtimestamp(t))

运行结果

  1. 1523943852.4797966
  2. 2018-04-17 13:44:12.479797

4)datetime.timedelta(时间间隔) 返回一个时间间隔对象,通过时间间隔可以对时间进行加减法得到新的时间

  1. import datetime
  2. #计算昨天的日期
  3. today = datetime.datetime.today()
  4. print(today.strftime("%Y-%m-%d %H:%M:%S"))
  5. timedelta = datetime.timedelta(days=1) #时间间隔为1天
  6. yesterday = today - timedelta
  7. print(yesterday.strftime("%Y-%m-%d %H:%M:%S"))

运行结果

  1. 2018-04-17 13:45:07
  2. 2018-04-16 13:45:07

二、文件与文件夹操作

1、文件操作

要先引入os模块

1)open方法打开一个已存在的文件或者创建新的文件。

  1. open(文件路径,访问模式,encoding=编码格式)

2)close()方法关闭已打开的文件

切记打开的文件最后要关闭

3)打开文件常用的三种访问模式

r:只读模式(默认)

w:只写模式

a:追加模式

  1. import os
  2. #要先引入os模块
  3. #"r":文件不存在则报错
  4. f = open("test.txt","r")
  5. f.close()

由于之前没有test.txt,上面这段程序会报错

  1. import os
  2. #"w":文件不存在则创建
  3. f = open("test.txt","w",encoding="utf-8") #覆盖已存在的内容,encoding="utf-8"解决中文乱码
  4. f.write("你好")
  5. f.close()

运行结果

test.txt

  1. 你好

4)write(data)方法向文件中写入字符串

  1. import os
  2. f = open("test.txt","a",encoding="utf-8") #"a":在已存在的内容后面追加,encoding="utf-8"解决中文乱码
  3. f.write("\n大家好")
  4. f.close()

运行结果
test.txt

  1. 你好
  2. 大家好

5)read()方法读取文件的全部内容

  1. import os
  2. f = open("test.txt","r",encoding="utf-8")
  3. print(f.read())
  4. f.close()

运行结果

  1. 你好
  2. 大家好

6)readlines()方法读取文件全部内容,放回一个列表,每行数据是列表中的一个元素

  1. import os
  2. f = open("test.txt","r",encoding="utf-8")
  3. data = f.readlines()
  4. print(data)
  5. print("-----------")
  6. i = 1
  7. for line in data:
  8. print("第{}行:{}".format(i,line),end="")
  9. i += 1
  10. f.close()

运行结果

  1. ['你好\n', '大家好']
  2. -----------
  3. 1行:你好
  4. 2行:大家好

7)readline()方法按行读取文件数据

  1. import os
  2. f = open("test.txt","r",encoding="utf-8")
  3. line1 = f.readline()
  4. print(line1,end="")
  5. line2 = f.readline()
  6. print(line2,end="")
  7. f.close()

运行结果

  1. 你好
  2. 大家好

8)writelines(字符串序列)将一个字符串序列(如字符串列表等)的元素写入到文件中

  1. import os
  2. f = open("test.txt","w",encoding="utf-8")
  3. f.writelines(["张三\n","李四\n","王五\n"])
  4. f.close()

9)os.rename(oldname,newname)文件重命名

  1. import os
  2. os.rename("d://test.txt","d://123.txt") #文件路径要相同,即前后为同一个文件

10)os.remove(filepath)删除文件

  1. import os
  2. os.remove("d://test.txt")

11)安全的打开关闭文件的方式(自动调用close方法)

  1. import os
  2. with open("d://test.txt","w") as f:
  3. f.write("hello python")

在使用with构造一个对象后,会调用这个对象的enter方法,with语句块执行结束后,会自动调用exit方法。对于open构造的对象,就是自动调用close了

2、文件夹操作

1)os.mkdir(path) 创建文件夹

  1. import os
  2. os.mkdir("d://testdir")

2)os.getcwd() 获取程序运行的当前目录

  1. import os
  2. print(os.getcwd())

运行结果

  1. D:\PycharmProjects\Lesson05

3)os.listdir(path) 获取指定目录下的文件列表

  1. import os
  2. print(os.listdir("d://"))

4)os.rmdir(path) 删除空文件夹

  1. import os
  2. os.rmdir("d://testdir")

只能删除空文件夹,否则会报错

5)shutil.rmtree(path) 删除非空文件夹

  1. import shutil #要先引入shutil模块
  2. shutil.rmtree("d://testdir")

6)os.chdir(path) 切换目录

  1. import os
  2. path = os.getcwd() #程序运行的当前路径
  3. print(path)
  4. os.chdir("../") #切换到上一级目录
  5. path = os.getcwd()
  6. print(path)
  7. os.chdir("d://") #切换到上一级目录
  8. path = os.getcwd()
  9. print(path)

运行结果

  1. D:\PycharmProjects\Lesson05
  2. D:\PycharmProjects
  3. d:\

三、JSON格式文件操作

要先引入json模块:import json

1)dumps(python_data):将Python数据转换为JSON编码的字符串

2)loads(json_data):将JSON编码的字符串转换为Python的数据结构

  1. import json
  2. json_dict = {"name":"zhangsan","age":20,"language":["python","java"],"study":{"AI":"python","bigdata":"hadoop"},"if_vip":True}
  3. json_str = json.dumps(json_dict)
  4. print(json_str)
  5. print(type(json_str))
  6. python_data = json.loads(json_str)
  7. print(python_data)
  8. print(type(python_data))

运行结果

  1. {"name": "zhangsan", "age": 20, "language": ["python", "java"], "study": {"AI": "python", "bigdata": "hadoop"}, "if_vip": true}
  2. <class 'str'>
  3. {'name': 'zhangsan', 'age': 20, 'language': ['python', 'java'], 'study': {'AI': 'python', 'bigdata': 'hadoop'}, 'if_vip': True}
  4. <class 'dict'>

3)dump(python_data,file):将Python数据转换为JSON编码的字符串,并写入文件

4)load(json_file):从JSON数据文件中读取数据,并将JSON编码的字符串转换为Python的数据结构

  1. import json
  2. json_dict = {"name":"zhangsan","age":20,"language":["python","java"],"study":{"AI":"python","bigdata":"hadoop"},"if_vip":True}
  3. # 写入文件
  4. with open("d://user_info.json","w") as f:
  5. json.dump(json_dict,f)
  6. # 读取文件
  7. with open("d://user_info.json","r") as f:
  8. user_info_data = json.load(f)
  9. print(user_info_data)
  10. print(type(user_info_data))

运行结果

  1. {'name': 'zhangsan', 'age': 20, 'language': ['python', 'java'], 'study': {'AI': 'python', 'bigdata': 'hadoop'}, 'if_vip': True}
  2. <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],…):一次写入多行数据

  1. #向csv文件写数据
  2. import csv
  3. datas = [["name","age"],["张三",20],["lisi",30]] #第一个列表是表示csv文件的标题
  4. with open("d://user_info_csv.csv","w",newline="",encoding="utf-8") as f:
  5. writer = csv.writer(f)
  6. for row in datas:
  7. #一次写入一行
  8. writer.writerow(row)
  9. #一次写入多行
  10. writer.writerows(datas)

3)reader(file_object):根据打开的文件对象返回一个可迭代reader对象

4)可以使用next(reader)遍历(reader)对象,获取每一行数据

  1. #从csv文件读数据
  2. import csv
  3. with open("d://user_info_csv.csv","r",newline="",encoding="utf-8") as f: #如果不指定newline="",则每写入一行将有一空行被写入
  4. reader = csv.reader(f) #reader可迭代对象
  5. header = next(reader) #读一行数据,读取后下面的reader中就没有这一行了
  6. print(header)
  7. print("------------")
  8. for row in reader:
  9. print(row)
  10. print(row[0])
  11. print(row[1])

运行结果

  1. ['name', 'age']
  2. ------------
  3. ['张三', '20']
  4. 张三
  5. 20
  6. ['lisi', '30']
  7. lisi
  8. 30
  9. ['name', 'age']
  10. name
  11. age
  12. ['张三', '20']
  13. 张三
  14. 20
  15. ['lisi', '30']
  16. lisi
  17. 30

由于之前在写入时使用writerow与writerows方法各写入一遍,因此调用的csv文件中有6行数据

5)DictWriter和DictReader对象处理Python字典类型的数据

  1. import csv
  2. header = ["name","age"]
  3. rows = [{"name":"zhangsan","age":20},{"name":"lisi","age":30},{"name":"wangwu","age":18}]
  4. #写入数据
  5. with open("d://user_info_csv_dict.csv","w",newline="",encoding="utf-8") as f:
  6. writer = csv.DictWriter(f,header)
  7. writer.writeheader()
  8. writer.writerows(rows)
  9. #读取数据
  10. with open("d://user_info_csv_dict.csv","r",newline="",encoding="utf-8") as f:
  11. reader = csv.DictReader(f)
  12. for row in reader:
  13. print(row)
  14. print("name:{},age:{}".format(row["name"],row["age"]))

运行结果

  1. OrderedDict([('name', 'zhangsan'), ('age', '20')])
  2. name:zhangsan,age:20
  3. OrderedDict([('name', 'lisi'), ('age', '30')])
  4. name:lisi,age:30
  5. OrderedDict([('name', 'wangwu'), ('age', '18')])
  6. name:wangwu,age:18

五、面向对象编程

面向对象编程(简称OOP):是一种解决软件复用的设计和编程方法。这种方法把软件系统中相似的操作逻辑、数据、状态等以类的形式描述出来,通过对象实例在软件系统中复用,从而提高软件开发效率。

1、类的定义

1)类:一个事物的抽象,定义了一类事物的属性和行为

2)类的构成:类的名称、类的属性、类的方法

3)类的定义

  1. class 类名:
  2. def 方法名(self[,参数列表])

类名的命名规则按照“大驼峰”

定义的方法默认要传入一个self参数,表示自己,self参数必须是第一个参数

  1. #定义类
  2. class Dog:
  3. def eat(self):
  4. print("小狗正在啃骨头...")
  5. def drink(self):
  6. print("小狗正在喝水...")

2、创建对象及对象的使用

1)对象:通过类创建的一个具体事物,它具有状态和行为,可以做具体的事情

2)类与对象的关系:类相当于创建对象的模板,根据类可以创建多个对象

3)创建对象:

对象变量名 = 类名()

  1. # 创建对象
  2. wang_cai = Dog()
  3. print(id(wang_cai))
  4. wang_cai.eat()
  5. wang_cai.drink()
  6. # 一个类可以创建多个对象
  7. a_fu = Dog()
  8. print(id(a_fu))
  9. a_fu.eat()
  10. a_fu.drink()

运行结果

  1. 31367800
  2. 小狗正在啃骨头...
  3. 小狗正在喝水...
  4. 35598856
  5. 小狗正在啃骨头...
  6. 小狗正在喝水...