python的文件操作

打开一个文件

python操作文件的步骤如下:

  1. 打开文件
  2. 操作文件
  3. 关闭文件

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)

只有11~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']
'''
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值