python 第五次课 文件操作

一、文件基础

1、⽂件的概念

  • l计算机的⽂件,就是存储在某种⻓期储存设备上的⼀段数据 ;

  • ⻓期存储设备包括:硬盘、U 盘、移动硬盘、光盘 ;

  • ⽂件的作⽤是可以将数据长期保存下来, 在需要的时候再使用。

二、⽂件的种类

1、⽂本⽂件

  • 可以使⽤⽂本编辑软件查看;

  • 例如:python 的源程序 ,txt 文本文件、doc、ppt、表格

2、 二进制⽂

  • 二进制文章是以01方式进行存储的

  • 保存的内容不是给⼈直接阅读的,⽽是提供给其他软件使⽤的

  • 例如:图⽚⽂件、⾳频⽂件、视频⽂件等等 ;

  • ⼆进制⽂件不能使⽤⽂本编辑软件查看。

三、⽂件操作流程

1. 操作⽂件的套路

⼀共包含三个步骤:

  • 第一步:打开⽂件 ;

  • 第二步:读、写⽂件 ;

    • 读: 将⽂件内容读⼊内存 ;

    • 写: 将内容写⼊⽂件 。

  • 第三步:关闭⽂件 。

2. ⽂件的函数/⽅法

在 Python 中要操作⽂件需要记住 1 个函数和 3 个方法

  • open 函数,打开文件

    • open 函数负责打开⽂件,并且返回⽂件对象

      • 如果⽂件存在------返回⽂件操作对象

      • 如果⽂件不存在------出错 ;

  • read / write / close 三个⽅法都需要通过 ⽂件对象 来调⽤

  • read ⽅法 —— 读取⽂件

  • open 函数的第⼀个参数是要打开的⽂件名(⽂件名区分⼤⼩写) ;

    • read ⽅法可以⼀次性读取文件的所有内容 。

    • close ⽅法负责关闭⽂件,如果忘记关闭⽂件,会造成系统资源消耗,⽽且会影响到后续对⽂件的访问 。

四、文件操作案例

1、打开文件格式

f = open("指定文件路径",打开方式,缓存方式)

案例

f = open("d:/py1/abc.txt","w")
f.close()

2、打开文件操作

打开文件读写方式

  • r+:是以读写方式打开,但是如果文件不存在,就会报错

  • w+:是以读写方式打开,但是如果文件不存在,就会创建新文件;如果文件存在,则正常打开

read方法**

  • 作用:是从打开的文件中读取内容

  • 原理:read是通过移动指针来从文件中读取内容

读取文件

案例1

# 打 开文件
file = open(r"C:\file\temp\a.txt", "r")
# 读取文件
text = file.read() # 显示读取内容print(text)
# 关闭文件
file.close()

案例:

#coding=utf-8
# 打开文件
file1 = open("D:/py1/a1.txt","r")

# 读取文件的内容
# 第一次读取文件的内容
str1 = file1.read()
# 第二次读取文件的内容
str2 = file1.read()

# 关闭文件
file1.close()

# 第一次读取文件内容,会正常输出,第二次执行read没有任何输出
# 因为第一次读取完成后,指针已经移动到了最后的位置
print(str1)
print(str2)

案例:从磁盘的文件中读内容**

#coding=utf-8
# 打开文件
file1 = open("D:/py1/a2.txt","w+")

# 读取文件的内容
str = file1.read()

# 关闭文件
file1.close()

print(str)

3、写入文件

write方法

  • 作用:是向文件中写入内容

案例

# 打 开文件
file = open(r"C:\file\temp\b.txt", "w")
# 写入内容
str1 = "hello world\n"
file.write(str1)
str1 = "hello python\n"
file.write(str1)
# 关闭文 件
file.close()

案例:向文件中写入内容

str1 = "hello boys\n"
str2 = "i am"
str3 = "zxhk\n"
str4 = "i come from hebei\n"

# 第一步:新建/打开文件
file = open("d:/py1/myfile.txt","a")

# 第二步:写入
file.write(str1)
file.write(str2)
file.write(str3)
file.write(str4)

# 第三步:关闭文件
file.close()

案例:将myfile.txt 复制一个新文件afile.txt

# 打开两个
# myfile.txt 以只读打开,然后读取内容
f1 = open("d:/py1/myfile.txt","r")
# afile.txt  以写打开,
f2 = open("d:/py1/afile.txt","w")

# 然后将从myfile.txt读的内容写入到afile.txt
str = f1.read()
f2.write(str)

# 关闭文件
f1.close()
f2.close()

4、文件打开方式

open 函数默认以只读⽅式打开⽂件,并且返回⽂件对象

1)r:以只读方式打开文件,文件的指针将会放在文件的开头。这是默认模式。

2)a:打开一个文件追加,如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。

3)w:以只写方式打开文件,如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在创建新文件

4)rb:以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片

5)ab:以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。

6)wb:以二进制格式打开一个文件用于只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。

7)r+:打开一个文件用于读写。文件指针将会放在文件的开头

8)a+:打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写

9)w+:打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件

10)rb+以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。

11)ab+以二进制格式打开一个文件用于追加。如果该文件已存在文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写

12)wb+以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在创建新文件。一般用于非文本文件如图片等

5、指定编码类型

file = open(文件名, 打开方式, encoding="编码")

五、文件常用方法

1)read() :从文件中读取全部内容,读取后指针指向文件末尾

2)read(siza):读取指定的子节数,参数可选,无参或参数为负时读取所有

3)weite():向文件中写入内容

4)file.seek(offset[, whence]):将文件对象移动到指定的位置;offset 表示移动的偏移量;whence 为可选参数,值为 0 表示从文件开头起算(默认值)、值为 1 表示使用当前文件位置、值为 2 表示使用文件末尾作为参考点

5)readline():执行一次readline,就会从文件中读取一行出来

6)readlines():执行一次readlines,就会将文件中的全部内容读取出来,并保存成一个列表,一行就是一个元素

案例:让用户输入5个用户名,将用户名保存到文件中

f = open("d:/py1/name.txt","w")

for n in range(5):
    name = input("please etner name: ")
    str = name + "\n"
    f.write(str)

f.close()

案例::让用户一直输入保存到文件中,并把输入的内容中“a"改变成大写,输入到q退出程序。

f=open("c:/py1/abc3.txt","w+")        #新建一个新的文件
while True:                           #衡循环
    userInput = input("enter:")       #用户输入内容
    if userInput =="q"or userInput =="Q": #判断有没有q
        break                         #有q就退出
    f.write(userInput+"\n")               #写入内容,换行
f.close()                             #关闭文件
f1=open("c:/py1/abc3.txt","r")        #以只读的形式打开
f2=open("c:/py1/abc4.txt","w")        #以只写的形式打开
li=f1.readlines()                     #逐行查看
for char in li:                       #遍历一下
  f2.write(char.replace("a","A"))     #逐个寻找“a"寻找到之后替换为“A”
f1.close()                            #关闭文件
f2.close() 

案例:让用户可以重复的输入内容**

  • 如果输入的不是q,就再输入一次

  • 如果输入的是q,就停止输入,并将输入的内容中的小写a转换为大写

#第一步:先将输入的内容保存文件

# 首先打开文件
newFile = open("d:/py1/newfile1.txt", "a")
#向文件进行写入操作
while True:
    # 让用户收入内容
    userInput = input("请输入内容:")
    # 判断用户输入的内容是否为q,如果是q,就通过
    if userInput == "q":
        break
    newFile.write(userInput+"\n")
 #保存文件
newFile.close()


#第二步:将文件中小写的a转大写,然后重新保存
# 首先打开文件
fileContent = open("d:/py1/newfile1.txt", "r")
lastFile = open("d:/py1/lastfile.txt", "w")
# 将内容的内容转换为一个列表
contentList = fileContent.readlines()

n = 0
maxN = len(contentList) - 1
# 遍历列表
while True:
    # 获取文件的每一行的内容
    str = contentList[n]
    n += 1
    # 小a转大a
    str = str.replace("a","A")
    # 将转换后的结果写入到新文件
    lastFile.write(str)

    if n > maxN:
        break

# 遍历完成后,关闭文件
lastFile.close()
fileContent.close()

六、读取内容

1、readline

  • readline 方法可以一次读取一行内容。

  • ⽅法执⾏后,会把⽂件指针移动到下⼀⾏,准备再次读取

  • readline 方法读取到文件最后,返回长度为 0 的字符串””

案例:计算文件c.txt中一共有几行

file = open("d:/py1/c.txt","r",encoding="utf-8")

n = 0
while True:
    str = file.readline()
    if len(str) == 0:
        break
    n += 1

print(n)

2、readlines

  • readline 方法可以一次读取全部内容,返回一个列表,内容的每一行是列的一个元素

# 打开文件
file = open(r"C:\file\temp\a.txt")
# text 类型为list,list 中每个成员就是文件a.txt 的每一行
text = file.readlines()
# 遍历列表text
for n in text:
	# 显示text 每个成员内容
	print(n) # 关闭文件file.close()

七、open变种写法

# 原始方法
f = open("a.txt", "r") 
text = f.read() 
print(text)
f.close()

# 新写法  【不需要手动关闭文件,文件会自动关闭】
with open("a.txt", "r") as f: 
	text = f.read() 
	print(text)

八、补充内容判断文件是否存在

import os
os.path.exists(文件名)

返回值

  • True

  • false

案例1:让用户输入文件名,判断文件是否存在

import os
file=input("请输入文件名:")
if os.path.exists(file):
    print("文件存在")

文件重命名

os.rename("旧文件名","新文件名")

获取指定目录下的所有文件名

os.listdir("指定路径")

修改工作目录

os.chdir("目标目录")

删除文件

os.remove("文件名")

注意:如果是变量则不需要加变量,加上引号就是字符串

案例:将d:/py1中的所有的文件,添加一个后缀.bak

 ##################################################
   files = os.listdir("d:/py1/")
   for var in files:
       odName = "d:/py1/" + var
       newName = "d:/py1/" + var + ".bak"
       os.rename(odName, newName)
  
  ###################################################
  # 将工作目录修改为 d:/py1/
  os.chdir("d:/py1/")
  # 将py1下的所有的文件名保存成一个列表
  fileList = os.listdir("./")
  # 遍历修改文件名
  for oldName in fileList:
      newName = oldName + ".bak"
      os.rename(oldName,newName)

九、作业

作业:让用户输入文件名,将文件复制成源文件名.bak【a.txt a.txt.bak】

  • 如果文件不存在,则让用户重新输入,最多输入4次

  • 如果文件存在,还要检查复制的新文件是否存在

    • 如果不不存在,则直接复制

    • 如果存在,则询问用户是否覆盖

import os
for num in range(4):
  file=input("请输入文件名:")#源文件
    if os.path.exists(file):#判断用户输入的文件是否存在
      print("文件存在")
        newf=file+".bak"#给文件添加新的后缀.bak
        if os.path.exists(newf):#判断新添加后缀的文件是否存在
            print("是否要覆盖源文件,输入y或Y确认覆盖,输入n或N取消覆盖")#文件存在询问用户是否要覆盖文件
          userInput=input("确认是否覆盖文件:")#让用户确认是否修改
            if userInput=="y" or userInput=="Y":#确认修改
              os.remove(newf)#删除原有的文件
                os.rename(file, newf)#原地修改文件的名字
                print("文件名修改成功")#提示修改成功
                break
          elif userInput=="n"or userInput=="N":#取消修改文件
                print("取消覆盖文件")#提示取消修改文件
          else:
                print("输入错误")#输入的不是y或是n,则提示输入错误
        else:
            os.rename(file,newf)#文件不存在,直接替换文件名
          break#停止循环
    else:
      print("文件不存在,请重新输入:")#提示用户文件不存在

作业1【所有人】:读取一个文件,显示除了以井号(#)开头的行以外的所有行

file = open("c:/py1/abc3.txt","r")
str = file.readlines()
for var in str:
    if var[0] == "#":
        pass
    else:
        print(var)
file.close()

十、数据序列化

1、概念

  • 序列化:将一个任意的数据类型转换成python能识别和处理的字符串

  • 逆序列化:将python能识别的字符串转换成对应的数据类型

  • 序列化的目的:将数据类型保存到磁盘上,也可以实现将数据发生给另外一个主机

数据类型

  • 字符串

  • 整数

  • 列表

  • 元组

  • 集合

  • 字典

实现序列化的方法

  • pickle

  • json

2、pickle模块

  • 序列化方法:pickle.dump()

  • 逆序列化方法:pickle.load()

pickle.dump实现序列化

pickle.dump(要保存的对象, 文件名)

案例:将字典实现保存到文件中

# 导入模块
import pickle
# 定义一个字典对象
nameList = {"tom":["hebei",18,"男"], "jerry":["tianjin",20,"女"]}
# 打开文件,打开方式 wb
file = open("d:/py1/c.pkl","wb")
# 用dump方法将字典写入到打开的文件中
pickle.dump(nameList, file)
# 关闭文件
file.close()

pickle.load实现逆序列化

pickle.load(文件名)

案例:从文件中读取字典类型保存的数据

import pickle
file = open("d:/py1/c.pkl","rb")
d1 = pickle.load(file)
file.close()
print(d1)

注意:可以多次执行序列化和逆序列化,但是不建议这么做

3、json模块

json的特点

  • JSON 是纯文本;

  • JSON 便于阅读和编写;

  • JSON 具有清晰的层级结构;

  • 有效地提升网络传输效率;

JSON 语法规则

  • 大括号保存对象;

  • 中括号保存数组;

  • 对象数组可以相互嵌套;

  • 数据采用键值对表示;

  • 多个数据由逗号分隔;

JSON 值

  • 数字(整数或浮点数);

  • 字符串(在双引号中);

  • 逻辑值(true 或 false);

  • 数组(在中括号中);

  • 对象(在大括号中);

{
    "name": "tom", 
    "age": 18,
    "isMan": true,
    "school": null, 
    "address": {
        "country": "中国",
        "city": "河北",
        "street": "石家庄"
	},
    "numbers": [2, 6, 8, 9],
    "links": [
        {
            "name": "zaizhuo",
            "url": "http://www.zaizhuo.cn"
        },
        {
            "name": "载卓",
            "url": "http://www.zaizhuo.com"
        }
	]
}

读取json文件

  • json.load(json文件名)

写入jion文件

  • json.dump(data, f, ensure_ascii=False)

案例:读取json文件

# 导入模块
import json
# 打开文件
f = open('d:/py1/1.json', "r", encoding='UTF-8')
# 读取json文件
data = json.load(f)
# 返回的data 数据类型为字典或列表
print(data)
f.close()

案例:写入json格式数据

import json
data = {'name': 'tom', 'age': 20, 'country': '中国'} f = open('temp.json', 'w', encoding='UTF-8') json.dump(data, f, ensure_ascii=False)
# ensure_ascii=False 代表中文不转义
f.close()


版权声明:本文为hanlifang123原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。