3.python编程——3.4.1打开文件

python读取纯文本文件利用open函数:

f = open('path','arg')

path表示你要读取的文件的路径(包含文件名称),可以是绝对路径,也可以是相对路径。
arg表示你读取这个文件采取的模式,默认不写是'r‘’只读。

python里面一共有以下几种模式:

r          ——文件以只读的方式打开;指针在文件开头

rb        ——以二进制方式打开一个只读文件;指针在文件开头

r+        ——文件可以读,可以写;指针在文件开头,写的方式类似于“insert”模式(会覆盖内容)

rb+      ——以二进制方式打开一个文件用于读写;指针在文件开头,写的方式类似于“insert”模式

w         ——文件只能写不能读,并且如果文件里面原来有内容,会被清空覆盖;指针在文件开头

wb       ——二进制

w+       ——文件能读能写,同样地,如果文件存在内容,则会被清空覆盖;指针在文件开头

wb+     ——二进制

a          ——文件能写不能读,和w不同,它是以添加的方式在文件末尾写入内容;指针在文件末尾

ab        ——二进制

a+        ——文件能读能写,也是以添加的方式在文件末尾写入内容

ab+      ——二进制

1.当不存在该文件时,w,w+,a,a+都会自动创建该文件。
2.以a和a+打开文件时,指针自动指向文件末尾
3.以r+打开文件时,指针自动指向文件头,“insert”模式。
————————————————

总结

举例:

例1:

原文链接:python文件打开方式详解——a、a+、r+、w+区别_IT届的小学生-CSDN博客

第一步 排除文件打开方式错误:

r只读,r+读写,不创建

w新建只写,w+新建读写,二者都会将文件内容清零

(以w方式打开,不能读出。w+可读写)

**w+与r+区别:

r+:可读可写,若文件不存在,报错;w+: 可读可写,若文件不存在,创建

r+与a+区别:

[python] fd = open("1.txt",'w+')  

  1. fd.write('123')  
  2. fd = open("1.txt",'r+')  
  3. fd.write('456')  
  4. fd = open("1.txt",'a+')  
  5. fd.write('789')  

结果:456789

说明r+进行了覆盖写。

以a,a+的方式打开文件,附加方式打开

a附加写方式打开,不可读;a+: 附加读写方式打开)

以 'U' 标志打开文件, 所有的行分割符通过 Python 的输入方法(例#如 read*() ),返回时都会被替换为换行符\n. ('rU' 模式也支持 'rb' 选项) . 

r和U要求文件必须存在

不可读的打开方式w和a

若不存在会创建新文件的打开方式:a,a+,w,w+

例2:

要了解文件读写模式,需要了解几种模式的区别,以及对应指针

r : 读取文件,若文件不存在则会报错

w: 写入文件,若文件不存在则会先创建再写入,会覆盖原文件

a : 写入文件,若文件不存在则会先创建再写入,但不会覆盖原文件,而是追加在文件末尾

rb,wb:分别于r,w类似,但是用于读写二进制文件

r+ : 可读、可写,文件不存在也会报错,写操作时会覆盖

w+ : 可读,可写,文件不存在先创建,会覆盖

a+ :可读、可写,文件不存在先创建,不会覆盖,追加在末尾

注意:这里的覆盖是指每次重新打开文件进行操作时覆盖原来的,如果是在打开文件中则不会覆盖

# 打开文件进行操作
with open("a.txt","w") as file:
    file.write("123")
    file.write("456")
# 结果为 123456 虽然w操作模式会进行覆盖,但是此时没有
 
# 再次打开文件进行操作
with open("a.txt","w") as file:
    file.write("123")
# 结果为 123 此时才是覆盖原来的a.txt
读、写操作时候涉及到指针

指针相关的函数有:seek(x[,y]),x设置指针的位置,y(=0开头,=1中间,=2末尾)

                                tell(),查询指针的位置

指针注意点:1.每次打开文件默认指针是在开头的,可以通过seek()来设置指针的位置进行读写操作

                      2. 每次操作都是从当前指针指向位置向后进行读写

例如:使用w模式(覆盖模式)进行写入时,指针会从头开始,写入完,指针指向最后

with open("a.txt","w") as file:
    print(file.tell())      //0,写入前指针为0
    file.write("123")       //写入123
    print(file.tell())      //3,写入后指针变为3
# a.txt为123
 
# 重新打开同一个a.txt文件
with open("a.txt","w") as file:
    print(file.tell())      //0,写入前指针为0
    file.write("456")       //写入456
    print(file.tell())      //3,写入后指针变为3
# a.txt为456
再来看看a模式(非覆盖模式)

with open("b.txt","a") as file:
    print(file.tell())      //0,写入前指针为0
    file.write("123")       //写入123
    print(file.tell())      //3,写入后指针变为3
# b.txt为123
 
# 重新打开同一个b.txt文件
with open("b.txt","a") as file:
    print(file.tell())      //3,写入前指针为3
    file.write("456")       //写入456
    print(file.tell())      //6,写入后指针变为6
# b.txt为123456
所以只要知道指针的起始位置以及最后位置,就能知道文件读取的内容

再来了解一下有关于文件读的时候

read([value]):value为设置内容读取的长度

举个例子(与指针结合起来看)

# 首先我先创建一个a.txt文件,内容为12345678
 
with open("a.txt","r") as file:
    content = file.read(3)       // 读取长度为3
    next_content = file.read()   // 第二次读取
    print(content)               // 123
    print(next_content)          // 45678
 
 
# 为什么第二次读取的时候结果会是45678呢?
# 在同一个打开文件中,因为第一次读取完,指针指向了3,所以再次读取时候,从指针3开始读取
再来将seek()函数引入,相同例子

# 首先我先创建一个a.txt文件,内容为12345678
 
with open("a.txt","r") as file:
    content = file.read(3)
    file.seek(1)                // 设置指针位置为1
    next_content = file.read()  // 第二次读取
    print(content)              // 123
    print(next_content)         // 2345678
 
# 由于seek设置了指针为2,所以第二次读取时候,从指针为2出进行读取了
 

文件读的操作相关还有readline,readlines,for in遍历

顾名思义 readline就是读取一行,readlines就是读取所有行

文件较大时,可以用readline或for in 遍历,节省内存,但是性能低

文件较小时,可以用read,readlines一次性处理,占用内存大,但是性能高

看了一下几个例子就能理解了:

# 先创建一个多行的txt文件
  a.txt:123
        456  
 
# for in 方法
with open("a.txt","r") as file:
    for i in file:
        print(i,end="")     //由于每行末尾默认带有换行符,所以end=""设置一下输出样式
 
// 结果为 123
          465
 
 
# readline 方法:每次读取一行
with open("a.txt","r") as file:
    content = file.readline()  
    print(content,end="")      //123
    content1 = file.readline()
    print(content1,end="")     //456
 
 
# readlines 方法 
with open("a.txt","r") as file:
    lines = file.readlines()   // 读取每一行
    for line in lines:         // 遍历取出每一行
        print(line,end="") 
 
// 结果为 123
          465
————————————————
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

舞动的白杨

客官,可否打赏UP主喝杯咖啡?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值