10 Python快速入门--文件处理

本文探讨了如何通过操作系统接口操作文件,包括双击文件的原理、硬盘读写操作、绝对路径与相对路径的区别,以及Python中文件打开模式、读写、定位和修改的方法。重点讲解了文件指针移动和不同模式下文件操作的细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文件操作

操作系统
	windows mac linux
双击文件
	硬盘转 磁头读取数据
保存文件
	硬盘转 磁头写入数据
 
我们在操作文件的时候其实操作的是硬盘
'''文件其实是操作系统暴露给我们可以简单快捷的操作硬盘的接口'''


绝对路径与相对路径
	绝对路径
    	非常详细的路径描述
        	无论什么人什么位置都可以找到
    相对路径
    	有一个参考
        	只有对应的人才可以找到

            
# 一、文件处理       

# res = open(r'a.txt','r',encoding='utf8')
# print(res.read())
# res.close()



# 打开a.txt 使用变量名f指代改文件
# with open(r'a.txt','r',encoding='utf8') as f:
#     print(f.read())  # 读取文件内容
    # with子代码运行结束之后会自动调用close关闭文件资源
# """
# with open(文件路径,读写模式,编码格式) as 变量名:
#     子代码块
# 文件路径是必须的
# 读写模式和编码格式是可选的
# """


# 如果不指定读写模式 那么默认使用r
# 如果不指定编码格式 那么默认使用当前计算机内部默认编码
"""在中国所有的windows电脑内部默认的编码是gbk"""
with open(r'a.txt') as f:
    print(f.read())  # 读取文件内容


# 取消转义
# res = r'D:\day08\a.txt'
# res1 = r'D:\day08\n.txt'
# res2 = r'D:\day08\t.txt'
# print(res,res1,res2)

with open(r'a.txt', mode='rt', encoding='utf-8') as f, \
		open(r'b.txt', mode='wt', encoding='utf-8') as f2:
    pass



# 二、文件打开模式
# 1、控制文件读写操作的模式
# r(默认)
# w
# a

# 2、控制文件读写内容的模式
# t(默认的):读写都是以字符串为单位的,只适用于文件文件,必须指定encoding参数
# b:读写都是以bytes为单位的,适用于所有文件,一定不能指定encoding参数


# r模式:只读模式,如果文件不存在则报错,文件存在则文件指针处于文件开头
f = open('a.txt',mode='rt',encoding='utf-8')
print(f.read())
print('='*50)
print(f.read())
print(f.readable())
print(f.writable())
f.close()

# w模式:只写模式,如果文件不存在则创建空文档,文件存在则清空,文件指针处于文件开头
f = open('a.txt',mode='wt',encoding='utf-8')
f.write("你好\n")
f.write("哈哈哈\n")
f.write("我擦勒\n")

f.write("你好\n哈哈哈\n我擦勒\n")
print(f.readable())
print(f.writable())

f.close()
# 总结:w模式,在打开了文件不关的情况下,连续的write写入,新写的内容永远跟在后面

# a模式:只追加写模式,如果文件不存在则创建空文档,文件存在不会清空,文件指针处于文件末尾
f = open('c.txt',mode='at',encoding='utf-8')
f.write("4444\n")
f.write("555\n")
f.write("6666\n")
print(f.readable())
print(f.writable())
f.close()

# 总结:a模式,在打开了文件不关的情况下,连续的write写入,新写的内容永远跟在后面,这一点与w模式相同
#    不同的是,在打开了文件关闭然后重新打开的情况下,a模式永远写在后面


# b模式:读写都是以bytes为单位的,适用于所有文件,一定不能指定encoding参数
with open('1.mp4',mode='rb') as f:
    res = f.read()
    print(res.decode('utf-8'))


with open('a.txt',mode='rb') as f:
	res = f.read()
	print(res.decode('utf-8'))


with open('a.txt',mode='ab') as f:
    f.write("啊手动阀手动阀".encode('utf-8'))


# 例:文件拷贝功能
# # 方案一:
with open('1.mp4',mode='rb') as f1,open(r'D:\1111111.mp4',mode='wb') as f2:
    res = f1.read()
    f2.write(res)


# 方案二:
# 储备知识:
with open('a.txt',mode='rt',encoding='utf-8') as f:
    # f.read()
    for line in f:
        print(line,end='')


with open('1.mp4',mode='rb') as f:
    for line in f:
        print(line)

# 具体实现:
with open('1.mp4',mode='rb') as f1,open(r'D:\1111111.mp4',mode='wb') as f2:
    for line in f1:
        f2.write(line)


# 可读可写
# r+t
# w+t
# a+t
#
# r+b
# w+b
# a+b

with open('a.txt',mode='r+t',encoding='utf-8') as f:
    print(f.readable())
    print(f.writable())
    print(f.read())
    f.write("22222222222222222222\n")



with open('a.txt',mode='w+t',encoding='utf-8') as f:
    print(f.readable())
    print(f.writable())

    
    
# 三、文件操作的其他方法
with open('a.txt',mode='rt',encoding='utf-8') as f:
    # lines = f.readlines()
    # print(lines)

    print(f.readline())
    print(f.readline())


with open('a.txt',mode='wt',encoding='utf-8') as f:
    # f.write("111\n222\n333\n")

    # lines = ['111\n','222\n','3333\n']
    # for line in lines:
    #     f.write(line)

    # f.writelines(lines)

    f.write('hello')
    f.flush()  # 令操作系统直接存储硬盘,而不是等缓存到一定大小后在存
    # f.writelines('hello')


# 四、操控文件指针移动

# 大前提:只有t模式下的,f.read(n)中的n代表的是字符个数,除此以外,关于指针的移动,单位都是字节bytes
# f.read()
# with open('a.txt',mode='rt',encoding='utf-8') as f:
#     res = f.read(6)
#     print(res)

# with open('a.txt',mode='rb') as f:
#     # res = f.read(6)
#     res = f.read(8)
#     print(res.decode('utf-8'))

# f.truncate()
# with open('a.txt',mode='r+t',encoding='utf-8') as f:
#     f.truncate(8)



# f.seek移动的全都是字节个数,字符串中:在UTF-8编码中:一个中文等于三个字节,中文标点占三个字节.一个英文字符等于一个字节,英文标点占一个字节。
# Unicode中:一个英文等于两个字节,一个中文(含繁体)等于两个字节。中文标点占两个字节,英文标点。	
f.seek(字节个数,0)
f.seek(字节个数,1)
f.seek(字节个数,2)

ps:只有0模式可以t下使用,其中12模式只能在b模式下使用,但是无论在t模式还是b模式下,移动的都是字节个数

with open('a.txt',mode='rt',encoding='utf-8') as f:
    print(f.tell())
    # f.seek(9,0)
    # f.seek(3,0)

    print(f.tell())


with open('a.txt',mode='rb') as f:
    print(f.tell())
    f.seek(9,1)
    f.seek(3,1)

    print(f.tell())

with open('a.txt',mode='rb') as f:
    print(f.tell())
    f.seek(0,2)

    print(f.tell())

with open('a.txt',mode='ab') as f:
    print(f.tell())
    
    
# 文件修改的两种方式

with open('test.txt', mode='r+t', encoding='utf-8') as f:
   f.seek(9,0)
   f.write("hello")


文件修改的原理:
把硬盘数据读入内存,在内存修改完毕后,再覆盖回硬盘

具体来说又分为两种方案
方案一:
with open('test.txt',mode='rt',encoding='utf-8') as f:
    data = f.read()

with open('test.txt',mode='wt',encoding='utf-8') as f:
    f.write(data.replace('egon','EGON'))


方案二:
import os

with open('test.txt',mode='rt',encoding='utf-8') as f1,\
        open('.test.txt.swp',mode='wt',encoding='utf-8') as f2:
    for line in f1:
        f2.write(line.replace('EGON',"egon"))

os.remove('test.txt')
os.rename('.test.txt.swp','test.txt')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值