Python文件操作

1. 何为文件

文件是为了存储和组织数据或信息而存在的。在计算机中,文件可以是任何类型的数据,包括文本、图像、音频、视频和代码等,它们被存储在计算机硬盘或其他存储设备上。

文件的存在使得我们可以方便地查看、修改、共享和传输数据或信息,也可以帮助我们更好地管理和组织数据。因此,文件在计算机中是非常重要和必不可少的。

2.基本操作文件

2.1读文件

2.1.1 读文本文件

# 1.打开文件
file_object = open('info.txt', mode='rb')
# 2.读取文件内容,并赋值给data
data = file_object.read()
# 3.关闭文件
file_object.close()

print(data) # b'alex-123\n\xe6\xad\xa6\xe6\xb2\x9b\xe9\xbd\x90-123'
text = data.decode("utf-8")
print(text)

1.打开文件

  • 路径:
    相对路径:‘info.txt’
    绝对路径:‘D:\oldboy\day10\info.txt’
  • 模式
    rb,表示读取文件原始的二进制(r, 读 read;b, 二进制 binary;)

示例:

# 1.打开文件
file_object = open('info.txt', mode='rt', encoding='utf-8')

# 2.读取文件内容,并赋值给data
data = file_object.read()

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

print(data)

2.1.2 读非文本文件(如图片等)

# 1.打开文件
file_object = open('info.txt', mode='rt', encoding='utf-8')

# 2.读取文件内容,并赋值给data
file_object = open('a1.png', mode='rb')
data = file_object.read()
file_object.close()

print(data) # \x91\xf6\xf2\x83\x8aQFfv\x8b7\xcc\xed\xc3}\x7fT\x9d{.3.\xf1{\xe8\...

2.1.3 判断文件位置是否存在

Ps:读文件时,文件不存在会报错

Traceback (most recent call last):
  File "/Users/wupeiqi/PycharmProjects/luffyCourse/day09/2.读文件.py", line 2, in <module>
    file_object = open('infower.txt', mode='rt', encoding='utf-8')
FileNotFoundError: [Errno 2] No such file or directory: 'infower.txt'

所以,在以读方式打开文件时,建议先去判断文件是否存在。

可以用os模块中的exists方法判断文件是否存在

示例

import os
file_path = 'D:\oldboy\day10\info.txt'
# 返回True表示存在,False表示不存在
exists = os.path.exists(file_path)

2.1.4 读文件方法

1. 读所有
f = open('info.txt', mode='r',encoding='utf-8')
data = f.read()
f.close()
2. 读n个字符(字节)
f = open('info.txt', mode='r', encoding='utf-8')
# 读1个字符
data = f.read(1)
f.close()

print(data)
f = open('info.txt', mode='rb')

# 读1个字节
data = f.read(3)
f.close()

print(data, type(data))  # b'\xe6\xad\xa6' <class 'bytes'>
3. 读一行
f = open('info.txt', mode='r', encoding='utf-8')

v1 = f.readline()
print(v1)

v2 = f.readline()
print(v2)

f.close()

4. 读所有行,每行作为列表的一个元素
f = open('info.txt', mode='rb')

data_list = f.readlines()

f.close()

print(data_list)
5.判断句柄是否可读
f = open('info.txt', mode='ab')
print(f.readable())

2.2 写文件

2.2.1 写文本文件

写字节类型

# 1.打开文件
# 路径:t1.txt
# 模式:wb(要求写入的内容需要是字节类型)
file_object = open("t1.txt", mode='wb')

# 2.写入内容
file_object.write("hello".encode("utf-8"))

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

写普通文本

file_object = open("t1.txt", mode='wt', encoding='utf-8')

file_object.write("武沛齐")

file_object.close()

2.2.2 写图片等文件

f1 = open('a1.png',mode='rb')
content = f1.read()
f1.close()

f2 = open('a2.png',mode='wb')
f2.write(content)
f2.close()

2.2.3 写文件方法

1. 普通写
f = open('info.txt', mode='ab')
f.write( "武沛齐".encode("utf-8") )
f.close()
2.将列表写入
f = open("b.txt", "w", encoding="utf-8")
data_list = ["123", "234", "345"]
f.writelines(data_list)  # 123234345
f.close()

若想将列表每一项写入需换单独行需自行换行

3.将内容从内存中写入硬盘
f = open('info.txt', mode='a',encoding='utf-8')

while True:
    # 不是写到了硬盘,而是写在缓冲区,系统会将缓冲区的内容刷到硬盘。
	f.write("abcdef")
    f.flush()
f.close()
4.判断文件句柄是否可写
f = open('info.txt', mode='ab')
print(f.readable())

3. 文件打开模式

基本文件操作实现了读、写的功能,其中涉及的文件操作模式:rt、rb、wt、wb,其实在文件操作中还有其他的很多模式。

符号含义
‘r’读文件(默认,不存在报错)
‘w’写文件(没有创建,有则清空)
‘x’创建新文件并写文件
‘a’有则末尾追加,没有先创建
‘b’二进制模式
‘t’文本操作(默认)
‘+’打开文件进行更新 (读和写)

关于文件的打开模式常见应用有:

模式字符文件和光标
只读rrtrb存在,读;不存在,报错
只写wwtwb存在,清空再写;不存在,创建再写
只写xxtxb存在,报错;不存在,创建再写。
只写aatab【尾部追加】存在,尾部追加;不存在,创建再写。
读写r+、rt+、rb+默认光标位置:起始位置
读写w+、wt+、wb+默认光标位置:起始位置(清空文件)
读写x+、xt+、xb+默认光标位置:起始位置(新文件)
读写a+、at+、ab+默认光标位置:末尾

4. with上下文管理

之前对文件进行操作时,每次都要打开和关闭文件,比较繁琐且容易忘记关闭文件。
使用with上下文管理,它可以自动实现关闭文件。

with open("xxxx.txt", mode='rb') as file_object:
    data = file_object.read()
    print(data)

在Python 2.7 后,with又支持同时对多个文件的上下文进行管理,即:

with open("xxxx.txt", mode='rb') as f1, open("xxxx.txt", mode='rb') as f2:
    pass

5.文件指针

5.1 指针移动

指针移动格式如下:

fileObject.seek(offset[, whence])

参数
offset – 开始的偏移量,也就是代表需要移动偏移的字节数
whence:可选,默认值为 0。给offset参数一个定义,表示要从哪个位置开始偏移;0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起。

PS:seek方法只移动只能以字节为单位。1模式和2模式只能以二进制方式打开。

在a模式下,调用write在文件中写入内容时,永远只能将内容写入到尾部,不会写到光标的位置。

5.2 获取光标当前位置

f = open('info.txt', mode='r', encoding='utf-8')

p1 = f.tell()
print(p1)  # 0

f.read(3)  # 读3个字符 3*3=9字节

p2 = f.tell()
print(p2)  # 9

f.close()
f = open('info.txt', mode='rb')

p1 = f.tell()
print(p1)  # 0

f.read(3)  # 读3个字节

p2 = f.tell()
print(p2)  # 3

f.close()

5.3 文件修改

# 实现思路:以读的方式打开原文件,以写的方式打开一个临时文件,一行行读取原文件内容,修改完后写入临时文件...,删掉原文件,将临时文件重命名原文件名
# 优点: 不会占用过多的内存
# 缺点: 在文件修改过程中同一份数据存了两份
import os

with open('db.txt',mode='rt',encoding='utf-8') as read_f,\
        open('.db.txt.swap',mode='wt',encoding='utf-8') as wrife_f:
    for line in read_f:
        wrife_f.write(line.replace('SB','kevin'))

os.remove('db.txt')
os.rename('.db.txt.swap','db.txt')
# 实现思路:以读的方式打开原文件,以写的方式打开一个临时文件,一行行读取原文件内容,修改完后写入临时文件...,删掉原文件,将临时文件重命名原文件名
# 优点: 不会占用过多的内存
# 缺点: 在文件修改过程中同一份数据存了两份
import os

with open('db.txt',mode='rt',encoding='utf-8') as read_f,\
        open('.db.txt.swap',mode='wt',encoding='utf-8') as wrife_f:
    for line in read_f:
        wrife_f.write(line.replace('SB','kevin'))

os.remove('db.txt')
os.rename('.db.txt.swap','db.txt')
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值