python3 文件操作(读、写)

python3 文件操作(读、写)

文件操作基本流程

计算机系统分为:计算机硬件操作系统应用程序三部分。

内存 存不长久
硬盘 数据的持久化
文件操作 —— 数据持久化的一种
全栈开发:框架类

操作文件的流程:
#1. 打开文件,得到文件句柄并赋值给一个变量
#2. 通过句柄对文件进行操作
#3. 关闭文件

 

coding:文件操作

习惯叫 f file f_obj f_handler fh
复制代码
#1. 打开文件,得到文件句柄并赋值给一个变量
f=open('a.txt','r',encoding='utf-8') #默认打开模式就为r

#2. 通过句柄对文件进行操作
data=f.read()

#3. 关闭文件
f.close()
复制代码

f=open('a.txt','r')分析

#1、由应用程序向操作系统发起系统调用open(...)
#2、操作系统打开该文件,并返回一个文件句柄给应用程序
#3、应用程序将文件句柄赋值给变量f

 

文件路径:相对路径、绝对路径
复制代码
#找到文件详解:文件与py的执行文件在相同路径下,直接用文件的名字就可以打开文件
            # 文件与py的执行文件不在相同路径下,用绝对路径找到文件
#文件的路径,需要用取消转译的方式来表示:1.\\    2.r''
#如果以写文件的方式打开一个文件,那么不存在的文件会被创建,存在的文件之前的内容会被清空
# '\n' 文件的换行
# f = open(r'C:\\Users\\Administrator\\Desktop\\s8_tmp.txt','w',encoding='utf-8')  # \\
f = open(r'C:\Users\Administrator\Desktop\s8_tmp.txt','w',encoding='utf-8')  #文件路径、操作模式、编码  # r''
f.write('哈哈哈')
f.close()
复制代码

 

 

关闭文件的注意事项

  注意

文件编码

复制代码
f = open('歌词','w',encoding='utf-8')    #f:文件操作符 文件句柄 文件操作对象
f.write('7018201890')
f.close()
#open打开文件是依赖了操作系统的提供的途径
#操作系统有自己的编码,open在打开文件的时候默认使用操作系统的编码
#win7\8--->gbk    mac/linux---->utf-8
复制代码

 

#这就用到了上节课讲的字符编码的知识:若要保证不乱码,文件以什么方式存的,就要以什么方式打开。
f=open('a.txt','r',encoding='utf-8')

文件的打开模式

文件句柄 = open('文件路径', '模式') 

 

打开文件
#打开文件
# f = open('歌词','r',encoding='utf-8')
f = open('歌词',encoding='utf-8')

 

模式
复制代码
#1. 打开文件的模式有(默认为文本模式):
r ,只读模式【默认模式,文件必须存在,不存在则抛出异常】
w,只写模式【不可读;不存在则创建;存在则清空内容】
a, 之追加写模式【不可读;不存在则创建;存在则只追加内容】

#2. 对于非文本文件,我们只能使用b模式,"b"表示以字节的方式操作(而所有文件也都是以字节的形式存储的,使用这种模式无需考虑文本文件的字符编码、图片文件的jgp格式、视频文件的avi格式)
rb 
wb
ab
注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码
复制代码

 

 

  了解1
  了解2

 

f.writable()   #判断文件是否可写
f = open('1.歌词.txt','w',encoding="utf-8")
print(f.writable())  # #判断文件是否可写
f.close()  # True
f.readable()   #判断文件是否可读
f = open('1.歌词.txt','w',encoding="utf-8")
print(f.readable())  # #判断文件是否可写
f.close()  # False

 

 

读文件

1.read方法会一次性的读出文件中的所有内容

 

 

复制代码
#1.读文件的第一种方式:read方法,用read方法会一次性的读出文件中的所有内容
f = open('1.歌词.txt',encoding='utf-8')
content = f.read()
print('read : ',content)  #
f.close()
复制代码

 

输出结果

 

复制代码
read :  111
222
aaa
bbb
哇哈哈
QQ星
复制代码

 

2.读一部分内容:read(n),指定读n个单位

复制代码
#2.读一部分内容:read(n),指定读n个单位
f = open('1.歌词.txt',encoding='utf-8')
print(f.read(2))  # 11
f.close()
复制代码

 

3.按照行读,每次执行readline就会往下读一行

复制代码
#3.读文件的第三种方式:按照行读,每次执行readline就会往下读一行
f = open('1.歌词.txt',encoding='utf-8')
content = f.readline()
print('readline : ',content.strip())    #strip去掉空格、制表符、换行符
content2 = f.readline()
print(content2.strip())
f.close()
复制代码

输出结果

readline :  111
222

 

4.readlines,返回一个列表,将文件中的每一行作为列表中的每一项返回一个列表

 

复制代码
#4.读文件的第四种方式:readlines,返回一个列表,将文件中的每一行作为列表中的每一项返回一个列表
f = open('1.歌词.txt',encoding='utf-8')
content = f.readlines()
print('readlines : ',content)  # readlines :  ['111\n', '222\n', 'aaa\n', 'bbb\n', '哇哈哈\n', 'QQ星']
f.close()
复制代码

 

5.读:最常用for循环

复制代码
#5.读:最常用for循环
f = open('1.歌词.txt',encoding='utf-8')
for l in f:
    print(l.strip())
f.close()
复制代码

输出结果

复制代码
111
222
aaa
bbb
哇哈哈
QQ星
复制代码

列子:

 1.歌词.txt

结果:

 1.读文件并整理成需要的数据类型

复制代码
f = open('1.歌词.txt',encoding='utf-8') #读文件并整理成需要的数据类型
goods_list = []
for line in f:
    if line.strip():
        goods_dic = {'name':None,'price':None}
        line = line.strip()
        goods_lst = line.split()
        print(goods_lst)
        goods_dic['name'] = goods_lst[0]
        goods_dic['price'] = goods_lst[1]
        goods_list.append(goods_dic)
print(goods_list)
f.close()
复制代码

 

输出结果:

  结果:
2.只显示文件中有内容的行
复制代码
f = open('1.歌词.txt',encoding='utf-8')    #只显示文件中有内容的行
goods_list = []
for line in f:
   if line.strip():
       print(line.strip())
f.close()
复制代码

 

输出结果:

  结果:

 

 

 

文件内的光标移动

一: read(3):

  1. 文件打开方式为文本模式时,代表读取3个字符

  2. 文件打开方式为b模式时,代表读取3个字节

二: 其余的文件内光标移动都是以字节为单位如seek,tell,truncate

注意:

  1. seek有三种移动方式0,1,2,其中1和2必须在b模式下进行,但无论哪种模式,都是以bytes为单位移动的

  seek参数详解

  2. truncate是截断文件,所以文件的打开方式必须可写,但是不能用w或w+等方式打开,因为那样直接清空文件了,所以truncate要在r+或a或a+等模式下测试效果

 

#tell: 告诉你当前光标所在的位置
  tell

 

#seek 光标移动到第几个字节的位置
  # f.seek(0)    移动到最开始
  # f.seek(0,2)  移动到最末尾

#truncate: 保留n个字节
  ps:
  
  1.txt

从文件开始的位置只保留指定字节的内容
复制代码
f = open('1.歌词.txt','r+',encoding='utf-8')
f.truncate(3)  #从文件开始的位置只保留指定字节的内容
content2 = f.readline()
print(content2.strip())  # aab
f.close()
复制代码

 查看1.txt文件,已被修改,只有aab3个字节了。

 

文件的修改

文件的数据是存放于硬盘上的,因而只存在覆盖、不存在修改这么一说,我们平时看到的修改文件,都是模拟出来的效果,具体的说有两种实现方式:

方式一:将硬盘存放的该文件的内容全部加载到内存,在内存中是可以修改的,修改完毕后,再由内存覆盖到硬盘(word,vim,nodpad++等编辑器)

复制代码
import os

with open('a.txt') as read_f,open('.a.txt.swap','w') as write_f:
    data=read_f.read() #全部读入内存,如果文件很大,会很卡
    data=data.replace('alex','SB') #在内存中完成修改

    write_f.write(data) #一次性写入新文件

os.remove('a.txt')
os.rename('.a.txt.swap','a.txt') 
复制代码

方式二:将硬盘存放的该文件的内容一行一行地读入内存,修改完毕就写入新文件,最后用新文件覆盖源文件

复制代码
import os

with open('a.txt') as read_f,open('.a.txt.swap','w') as write_f:
    for line in read_f:
        line=line.replace('alex','SB')
        write_f.write(line)

os.remove('a.txt')
os.rename('.a.txt.swap','a.txt') 
复制代码

 

 

猜你喜欢

转载自blog.csdn.net/qq_41984637/article/details/80056870