python文件操作

介绍:

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

我们用python或其他语言编写的应用程序若想要把数据永久保存下来,必须要保存于硬盘中,这就涉及到应用程序要操作硬件,众所周知,应用程序是无法直接操作硬件的,这就用到了操作系统。操作系统把复杂的硬件操作封装成简单的接口给用户/应用程序使用,其中文件就是操作系统提供给应用程序来操作硬盘虚拟概念,用户或应用程序通过操作文件,可以将自己的数据永久保存下来。

有了文件的概念,我们无需再去考虑操作硬盘的细节,只需要关注操作文件的流程:

#1. 打开文件,得到文件句柄并赋值给一个变量
#2. 通过句柄对文件进行操作
#3. 关闭文件
#1. 打开文件,得到文件句柄并赋值给一个变量
f=open('a.txt','r',encoding='utf-8') #默认打开模式就为r

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

#3. 关闭文件
f.close()

了解文件操作模式:

1、读模式

  • f.read()
  • f.readable()#这个文件是否可读,返回布尔值;
  • f.readline(“读模式”)#读取第一行;f.readlines(“读模式”)#读取所有内容 以字符串方式存储在列表内;

2、写模式

  • f.write('写模式')   #注意写之前会清空原文本文件,然后进行写入! 若没有文件则会新创建一个文件进行写入;
  • f.write("写模式1 写模式2 写模式3 写模式4 ")   #换行写入;
  • f.writelines(["写模式1 写模式2 写模式3 写模式4 "])   #该模式要传入的数据类型必须是列表;
  • f.writable()  #这个文件是否可写,返回布尔值;
f = open('小重山','w',encoding='utf-8') #第一个参数是文件位置,第二个参数是写模式,第三个参数是定义编码
data = f.write('写模式')
print(data)
f.close()
#注意 写之前会清空原文本文件,然后进行写入!  若没有文件则会新创建一个文件进行写入


f = open('name','w',encoding='utf-8') #第一个参数是文件位置,第二个参数是写模式,第三个参数是定义编码
data = f.write("写模式1
写模式2
写模式3
写模式4
")
print(data)
f.close()
写模式1
写模式2
写模式3
写模式4
f.writelines(["写模式1
写模式2
写模式3
写模式4
"])#该模式要传入的数据类型必须是列表

f = open('小重山','a',encoding='utf-8') # a 代表 append 追加 不会清空原文件
data = f.write('写模式')
print(data)
f.close()
View Code

3、r+ , w+ , a+模式

with:

同时管理多个文件对象

with open('log1','r') as f_read, open('log2','w') as f_write:
     for lien in f_read:
         f_write.write(lien)
View Code

操作方法总结:

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

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

#3. 了解部分
"+" 表示可以同时读写某个文件
r+, 读写【可读,可写】
w+,写读【可读,可写】
a+, 写读【可读,可写】


x, 只写模式【不可读;不存在则创建,存在则报错】
x+ ,写读【可读,可写】
xb
View Code
f = open("name","rb")
date = f.read()
#字符串------------>>>encode----------->>>bytes
#bytes------------>>>encode----------->>>字符串
print(date)
print(date.decode("utf-8"))

4、文件修改过程实质上就是覆盖的过程

#1、将要修改的文件从硬盘读取到内存中
#2、在内存中修改文件
#3、把修改后的文件覆盖到硬盘中

#普通版
f = open("name","r",encoding="utf-8")
date = f.readlines()#读取所有内容 以字符串方式存储在列表内
f.close()
t = open("小重山","w",encoding="utf-8")
t.write(date[1]) #通过切片的方式将列表内容取出并写到文件中
t.close()
#升级版
with open("name","r",encoding="utf-8") as f,
        open("小重山","w",encoding="utf-8") as t:  #(as f)等价于(f=),斜杠回车换行
    date = f.readlines()
    f.close()
    t = open("小重山", "w", encoding="utf-8")
    t.write(date[0])
    t.close()
View Code

 5、文件的其他操作

  • 文件内光标的移动:

    注意:read(3)代表读取3个字符,其余的文件光标移动都是以字节为单位如seek,tell,truncate

# f = open("name","r+",encoding="utf-8",newline="")#去掉回车键的处理显示原值
;
# deta = f.read(3)#以字符方式读取
# print(f.tell())
# f.seek(12)#以字节方式调整光标的位置,(在windows系统中(/r/n)表示回车换行)
# print(f.tell())#以字节方式读取光标的位置
# print(f.readlines())
# print(f.truncate(3))#文件截取实际就是在写文件必须用(r+,a+)
# f.flush() #把缓存里的数据更新到磁盘上(防止程序崩溃数据丢失)作用于终端

seek的高级用法:
seek("光标的参数",0)#正序,默认从0开始数 seek(10,0)=seek(10)
seek("光标的参数",1) #相对位置,相对于光标上次停在的位置 seek(10,1)
seek("光标的参数",2)#倒序,从文件的最后一个字符开始数,seek(-10,2)
a = [1234,456,"dasfgf","we2","xdfcgbhjk","234567"]
print(len(a)) #查看列表的长度
print(a[-1]) #提取列表中的最后一行


#需求:读取日志文件的最后一行。
f = open("name","rb")#以字节的方式读取
for i in f: #直接从文件中遍历,要一行取一行,不占内存;
    #print(i.decode("utf-8"))#解码
    offs = -10  #定义偏移量
    while True:
        f.seek(offs,2)  #倒序,从最后一行开始数,
        data = f.readlines() #将光标移动到的所有字符转换成列表
        if len(data) > 1: #判断列表的长度
            print("文件的最后一行是: %s" %(data[-1].decode("utf-8")))#取列表的最后一行
            break
        offs*=2 #如果最后一行没有取完则重新定义偏移量,知道len(data)>1;
View Code
 
f = open('小重山','r',encoding='utf-8') #第一个参数是文件位置,第二个参数是写模式,第三个参数是定义编码
number = 0
for i in f:   #这里for内部将f做成一个迭代器,用一行取一行,用完清空,不占内存
    number += 1
    if number == 2:
        i = ''.join([i.strip() , 'oooo'])
    print(i.strip())
f.close()


print(f.tell(3))  #打印光标的位置 对于英文字符就占一个,中文字符占3个;

print(f.seek(3))  #调整光标位置的


f.flush() #把缓存里的数据更新到磁盘上(防止程序崩溃数据丢失)


>>> f = open('hello','w')
>>> f.write('alex is 35 ')11
>>> f.write('hello world')11
>>> f.flush() 
alex is 35 hello world

#进度条效果展示

import sys,time

for i in range(30):  #第一种方法
    sys.stdout.write('=')
    sys.stdout.flush()
    time.sleep(0.1)


for i in range(30):  #第二种方法
    print('=',end='',flush=True)
    time.sleep(0.1)
f.truncate()# 截取字符

f = open('小重山','a',encoding='utf-8')
f.write('asfzxc')
f.truncate(5)
View Code
原文地址:https://www.cnblogs.com/songzhixue/p/9942069.html