打开一个文件
python操作文件的步骤如下:
- 打开文件
- 操作文件
- 关闭文件
1.打开一个文件并读取所有内容
f = open(r"D:\Desktop\1.txt")
content = f.read()
print(content)
2.读取指定的行,例如只读取第5行。windows中的路径符号 \ 会被python识别为转义字符,所以使用 r."D:\Desktop..."
f = open(r"D:\Desktop\seq.txt")
print(f.seek(5))
结果:
5
3.seq.txt
文件为10行,内容1~10
f=open("D:\Desktop\seq.txt", encoding="utf-8")
data1=f.read()
data2=f.read()
f.close()
print(data1)
print(data2)
只有1次1~10,因为第二次是从末尾开始读,所以读不到内容
4.把文件中读取到内容放入列表:
f = open("D:\Desktop\seq.txt", mode='r')
data = f.readlines()
print(data)
f.close()
['1\n', '2\n', '3\n', '4\n', '5\n', '6\n', '7\n', '8\n', '9\n', '10']
取消读文件时的换行符
f = open(r'D:\desktop\1.txt', mode='r')
for i in f:
print(i.strip())
f.close()
with open(r'D:\Desktop\python\3.txt', mode='r', encoding='utf-8') as f:
content = f.read()
for line in content:
print(line, end='')
# 运行结果
'''
wzy1
wzy2wzy3, 开始换行
wzy4
wzy5
wzy5
wzy6
'''
5.打印文件的指定行,例如第3行
# 方式1:
f = open(r'D:\desktop\1.txt', mode='r')
num = 0
for i in f:
num += 1
if num == 3:
print(i.strip())
# 方式2:enumerate默认从0行开始计数
f = open(r'D:\desktop\1.txt', mode='r')
num = 0
for index, i in enumerate(f):
if index == 2:
print(i.strip())
f.close()
6.打印包含关键字的行
文件内容:
MemTotal: 4026152 kB
MemFree: 2423560 kB
MemAvailable: 2962672 kB
Buffers: 148460 kB
f = open(r'D:\desktop\python\2.txt', mode='r')
for i in f:
if i.startswith('MemAvailable'):
# -1表示最后一个元素
print(i.split(': ')[-1].strip( ))
f.close()
'''
2962672 kB
'''
7.使用文件句柄管理问文件
with open('03-循环.py', mode='r', encoding='utf-8') as f:
print(f)
content = f.read()
print(content)
'''
<_io.TextIOWrapper name='D:\\desktop\\python\\2.txt' mode='r' encoding='utf-8'>
MemTotal: 4026152 kB
MemFree: 2423560 kB
MemAvailable: 2962672 kB
Buffers: 148460 kB
'''
文件的访问模式
简单格式:file_object = open(file_path, mode=" ")
简单格式:file_object = open(file_path, mode=" ")
-
r 只读模式,不能写(文件必须存在,不存在会报错)
-
w 只写模式,不能读(文件存在则会被覆盖内容(要千万注意),文件不存在则创建)
-
a 追加模式,不能读
-
r+ 读写模式
-
w+ 写读模式,先清空源文件内容
-
a+ 追加读模式
-
rb 二进制读模式
-
wb 二进制写模式
-
ab 二进制追加模式
-
rb+ 二进制读写模式
-
wb+ 二进制写读模式
-
ab+ 二进制追加读模式
只读®
f.read()
在第一次调用时,会读取文件中的所有内容并将文件指针移动到文件的末尾。当再次调用 f.read()
时,文件指针已经到达末尾,因此返回的内容为空。
f = open(r'D:\desktop\2.txt', encoding='utf-8')
data1 = f.read()
data2 = f.read()
print(data1)
print(data2)
f.close()
在第二次读取时能够再次读取文件中的内容,可以使用以下方法:
f = open(r'D:\desktop\2.txt', encoding='utf-8')
data1 = f.read()
f.seek(0) # 重置文件指针到文件开头
data2 = f.read() # 第二次读取
print(data1)
print(data2)
f.close()
read() readline 和 readlines 区别
read 会读取所有文件
# readline
with open(r'D:\Desktop\python\3.txt', mode='r', encoding='utf-8') as f:
comment = f.readline()
print(comment)
# 只输出1行:
wzy1
# readlines 输出结果为列表
['wzy1\n', 'wzy2wzy3, 开始换行\n', 'wzy4\n', 'wzy5\n', 'wzy5\n', 'wzy6']
seek的使用
seek(offset, whence)
方法的参数 whence
定义了相对于某个位置的偏移方式:
0
:相对于文件的起始位置(SEEK_SET
)。1
:相对于当前文件指针的位置(SEEK_CUR
)。2
:相对于文件的末尾位置(SEEK_END
)
readline()
每次读取一行,并返回该行内容。如果文件读取到了末尾,readline()
会返回空字符串(或空字节串,取决于文件模式)
import time
with open(r"D:\Desktop\python\3.txt", mode='rb') as f:
# 把文件指针移动到最后
f.seek(0,2)
while True:
# len(line)打印当前的文件指针
line=f.readline()
if len(line) == 0:
time.sleep(0.3)
else:
print(line.decode('utf-8'),end='')
只写模式(w)
只写模式(不能读),文件不存在则创建新文件,如果文件存在,则会复盖原内容
f = open(r'D:\desktop\2.txt', encoding='utf-8', mode='w')
data = f.read()
print(data)
f.close()
果然文件被清空了,还有一些报错显示
line 2, in <module>
data = f.read()
io.UnsupportedOperation: not readable # 只读的文件
2.写入多行内容写入案例
f = open(r'D:\desktop\3.txt', encoding='utf-8', mode='w')
f.write('wzy1\n'
'wzy2'
'wzy3, 开始换行\n'
'wzy4\n'
'wzy5\n')
f.flush()
f.close()
查看写好的文件
wzy1
wzy2wzy3, 开始换行
wzy4
wzy5
3.拓展篇:truncate
f.truncate() # 截断,括号里没有数字,那么就是不删除
f.truncate(3) # 截断,数字为3,就是保留前3个字节
f.truncate(0) # 截断,数字为0,就是全删除
4.不换行输出。
write()
不会自动在输出后添加换行符,每次输出的'wzy'
会连续打印在同一行。flush()
强制将缓冲区中的内容立即输出到标准输出。虽然write()
已经将'wzy'
写入缓冲区,但flush()
确保在屏幕上立刻显示,而不等缓冲区满或者程序结束
import sys, time
for i in range(50):
sys.stdout.write('wzy')
sys.stdout.flush()
time.sleep(0.2)
5.把内容写入到下一行中(比较实用),类似于日志追加 >>
import json
data = [1, "aaa", True, "false"]
res = json.dumps(data)
# 使用追加模式写入文件并添加换行符
with open(r'test.txt', mode='at', encoding='utf-8') as file:
for _ in range(3): # 模拟写入三次
file.write(res + '\n') # 每次写入时添加换行符
查看写好的文件
[1, "aaa", true, "false"]
[1, "aaa", true, "false"]
[1, "aaa", true, "false"]
6.复制二进制文件把2.png复制一份为3.png
with open(r"C:\Users\wzy\Pictures\图片2.png", 'rb')as srcFile, open(r"C:\Users\wzy\Pictures\图片3.png", 'wb') as destFile:
for line in srcFile:
destFile.write(line)
追加模式(a)
1.运行该代码,类似shell里的 >> 符,结果如下
f=open(r'D:\Desktop\a.txt', mode='a')
f.write('wzy\n')
f.write('wzy666\n')
f.close()
wzy
wzy666
使用追加模式实现注册功能
用户输入用户名+ 密码就保存到passwd.txt,格式为:wzy:123
with open(r'D:\Desktop\python\a.txt', encoding='utf-8', mode='a') as f:
input_username = input('Please name: ')
input_password = input('Please password: ')
f.write('{}:{}'.format(input_username, input_password))
python中读的特性
- 当打开文件时,文件的指针(读取的位置)从文件的开头开始,指向文件的第一个字节
f=open(r'D:\Desktop\3.txt', mode='r')
print(f.tell())
# 把文件指针移动到第5
f.seek(5)
print(f.tell())
# 输出
0
5
- 只显示第一行,把光标移动到这一行的最后。简称为读取单行
f=open(r"D:\Desktop\1.txt", mode='r', encoding='utf-8')
data2=f.readline()
f.close()
print("data2:",data2)
data2: 1 wzy
- 把每一行输出为一个列表,(读取到文件结尾)
f=open(r"D:\Desktop\1.txt", mode='r', encoding='utf-8')
data3=f.readlines()
print(data3)
结果为
['1 wzy\n', '2 wzy\n', '3 wzy\n', '4 wzy\n', '5 wzy\n', '6 wenzhiyong\n', '7 wenzhiyong\n', '8 wenzhiyong\n', '9 wenzhiyong\n', '10 wenzhiyong']
1.打印文件前3行:
with as f
用于将上下文管理器(如文件对象)赋值给变量f
,并确保在with
块执行完后自动释放资源(如自动关闭文件)
with open(r'D:\Desktop\1.txt', mode='r', encoding='utf-8') as f:
# 读取前 3 行并打印
for i in range(3):
line = f.readline()
if line is not None: # 检查文件是否结束
print(line, end='') # 不去除换行符,直接打印
else:
break # 如果文件没有足够的行,提前退出
文件内容的修改
- 注意磁盘数据不能修改,而是覆盖掉旧的数据来达到修改的效果
文件内容如下,要求把wzy替换为wenzy并写入到一个新的文件当中
wzy1
wzy2wzy3, 开始换行
wzy4
wzy5
把原文件3.txt全部读入内存,然后再修改
with open(r"D:\Desktop\python\3.txt", mode='r', encoding='utf-8') as f, \
open(r"D:\Desktop\python\33.txt", mode='a', encoding='utf-8') as f1:
line = f.read()
data = line.replace('wzy', 'wenzy')
print(data)
f1.write(data)
每读取一行就写入到新文件
import os
with open(r"D:\Desktop\python\3.txt", mode='rt', encoding='utf-8') as f, \
open(r"D:\Desktop\python\.33.txt.wap", mode='wt', encoding='utf-8') as f1:
for line in f:
f1.write(line.replace('wzy', 'wenzy'))
os.rename(r"D:\Desktop\python\.33.txt.wap", r"D:\Desktop\python\33.txt")
循环读文件
1.读取一个文件的所有内容,即使文件体积比较大性能也可以
f = open(r"D:\Desktop\python\mem.txt", mode='r', encoding='utf-8')
for line in f:
print(line.strip())
f=open(r"D:\Desktop\1.txt", mode='r', encoding='utf-8')
for index, line in enumerate(f.readlines()):
print(index, line.strip())
# 建议第二种方法,因为每打印一行就会输出,而不是像前面那样直接换行
f=open(r"D:\Desktop\1.txt", mode='r', encoding='utf-8')
for index, line in enumerate(f):
print(index, line.strip())
2.读取csv文件案例
import csv
with open(r"D:\Desktop\1.csv", 'r', encoding='utf-8') as f:
a_csv = csv.reader(f)
headers = next(a_csv)
print(headers)
for row in a_csv:
print(row)
'''
['name', 'age', 'sex']
['wzy', '18', 'male']
'''