文件操作

一、初始文件操作:

  使用Python来读写文件是非常简单的操作。

  我们使用open()函数来打开一个文件,获取到文件句柄,然后通过文件句柄就可以进行操作了,根据打开方式的不同能够执行的操作也会有相应的差异。

二、文件操作模式

只读操作-- 'r'

#文件操作默认'r'模式
# ------------ r ------------
f = open('123','r',encoding='utf-8') #句柄
content = f.read()
# 一次性将文件内容全都读出来,但是如果内容很多,会崩溃的
print(content)
con_1 = f.readline()#将内容一行一行输出
con_2 = f.readline()
print(con_1+con_2)

ls = f.readlines() # 返回list 遍历列表即可得到内容
s = ''
for i in ls:
    s = s + i
print(s)

'rb' 读取出来的是bytes类型,不能选择encoding字符集

# -------- rb --------
f = open('文件示例','rb') #句柄
print(f.read()) # b'xe4xbdxa0xe5x9cxa8
'
#UTF-8编码下 一个中文占3个字节

rb的作用:

在读取非文本文件的时候,比如读取MP3图像、视频等信息的时候就需要用到rb,因为这种数据是没办法直接显示出来的,在后面我们文件上传下载的时候还会用到。

相对路径和绝对路径:

1、绝对路径:从磁盘根目录开始一直到文件名

2、相对路径:同一个文件夹下的文件,相对于当前这个程序所在的文件夹而言。如果在同一个文件夹中,则相对路径就是这个文件名,如果在上一层文件夹,则要../(跳出当前文件夹)

#相对路径和绝对路径
#相对路径 ../跳出当前文件夹
# f = open('../day06/文件示例',mode='r',encoding='utf-8')
# print(f.read())

#绝对路径 -- 在磁盘中存在的位置
# f = open('/Users/langying/Desktop/hello.txt','r',encoding='utf-8')
# content = f.read()
# print(content)
# f.close() #关闭文件句柄
View Code

我们更推荐大家使用相对路径。因为我们在把程序拷贝给别人使用的时候,直接把项目拷贝走就可以运行,但是如果用绝对路径,还需要拷贝外部文件。

读取文件的方法:

(1)read():将文件中的内容全部读取出来,弊端:占内存,如果文件过大,容易导致内存崩溃

(2)read(n):读取n个字符,注意:如果再次读取,那么会在当前位置继续去读而不是从头读,如果使用的是rb模式,,则读取出来的是n个字节。

(3)readline():一行一行读取数据

(4)readlines():将每一行形成一个元素,放到一个列表中。将所有的内容都读取出来,容易出现内存崩溃的问题

(5)循环读取

# ------------ r ------------
f = open('123','r',encoding='utf-8') #句柄
content = f.read()
# 一次性将文件内容全都读出来,但是如果内容很多,会崩溃的
print(content)
con_1 = f.readline()#将内容一行一行输出
con_2 = f.readline()
print(con_1+con_2)

print(f.read(3)) #一次性读3个字节

ls = f.readlines() # 返回list 遍历列表即可得到内容
for i in ls:
    print(i) #循环读取
View Code

读取完一定要关闭 f.close()

写模式

# -------- w -----------
f = open('123','w',encoding='utf-8')
# 文件名不存在则创建新文件
f.write('写模式下会先删除原来的内容,再继续写')

# wb 模式 可以不指定打开文件的编码,但是写文件的时候一定写入bytes数据
f =  open('123',mode='wb')
f.write('金毛狮王'.encode('utf-8'))
f.flush()
f.close()
View Code

追加模式

# --------- a ----------
f = open('123','a',encoding='utf-8')
f.write('a - append 从原来内容末尾追加')
f.close()

读写模式

对于读写模式,必须是先读,因为默认光标在开头,读完了在进行写入

# --------- r+ 可读可写 侧重读 ------------
f = open('123','r+',encoding='utf-8')

#正常的顺序应该先读再写
content = f.read() #光标从头开始读到尾
print(content)
f.write('你好啊') #光标从尾开始继续写内容
f.flush() #保证所有的文本都写到了内容里面
content = f.read() #读不出来了,因为光标已经到了最后了
print(content) #
f.close()

#尝试一下先写后读 -- 不可以的
f.write('你好啊') #文件开头从"你在干"变成了'你好啊'
#因为文件光标刚开始在开头,所以当你执行写操作的时候,光标从开头覆盖原文本
print(f.read()) #读取的内容不全
#光标在执行完写操作以后,光标已经停留到了'你好啊'后,所以无法打出这三个字
f.flush()
f.close()
View Code

写读模式

在w+模式下,必须先读后写

# --------- w+ --------
f = open('文件示例','w+',encoding='utf-8')
f.write('将文件内容清空,然后写入')
print(f.read()) #读不出来,因为光标在最后
f.flush()
f.close()

追加读模式

a+模式下,无论先读还是后读都是读不到数据的

# ---------- a+ --------
f = open('文件示例','a+',encoding='utf-8')
f.write('在末尾追加')
print(f.read()) #读不出来,因为光标在最后
f.flush()
f.close()

其他操作

# 移动光标的方法
f = open('123','r+',encoding='utf-8')
f.seek(0) #将光标移动到开头
f.seek(0,2) #将光标移动到结尾
f.tell() #光标所在位置
f.truncate()#将后面所有的内容全部截掉
f.close()

注意:

在r+模式下,如果读取了多少内容,光标显示的多少,再写入或者操作文件的时候都是在结尾进行的操作。

所以如果想做截断操作,要先移动光标,移动到你想要截断的位置,再进行截断。

关于截断操作:如果给出了n,则从开头进行截断,不给n,则从当前位置截断,后面的内容将会被删除。

修改文件以及另一种文件打开方式:

#不用每次都f.close()的方法
with open('123','r+',encoding='utf-8') as f:
    pass


#将文件中的Alex全部替换成'Tommy'
#打开老文件,将内容替换,再生成一份新文件,删除旧文件,重命名新文件
with open('123','r+',encoding='utf-8') as f ,
    open('123_1','w',encoding='utf-8') as f1:
    for i in f:
        # print(i.strip())
        i = i.replace('Alex','Tommy')
        f1.write(i)
#在文件开始导入os模块
os.remove('123') #删除旧文件
os.rename('123_1','123') #将新文件改名字
原文地址:https://www.cnblogs.com/liangying666/p/9156204.html