python文件读写_Python文件读写 - 文件r+ a+ open读写实际表现[示例]

先说结论:

文件r+ open:

1. write()不能实现插入写,它总是覆盖写或附加写;

2. 如果文件一打开即write(),则从开头覆盖写;

3. 如果文件一打开,用f.seek()指定文件指针位置,然后执行f.write()则从指针位置写(覆盖写);

4. 如文件打开后先执行了readline(), 然后再执行write(),实现的是附加写

文件a+ open:

1. 文件打开后起始指针为文件末尾,readline()将读不到数据

2. write()始终是附加写 ,即使将文件指针指到中间再执行write()仍然附加写

共性:

1. write()是先写内存,f.close()时才将物理写入

2. f.tell()函数把'\n'换行符当成一个字符而不是两个,计算偏移量时会是1不会是2

测试过程:

文件companies.txt内容:

google

tencent

alibaba

baidu

r+模式:

# python version: 3.6.3

>>> f = open(r'python/file/companies.txt','r+')>>> f.tell() #查看文件指针值

0>>> f.readline() #读一行

'google\n'

>>> f.tell() #再次查看文件指针值

7

>>> f.write('xxx') #在文件指针位置为7时,尝试写入字符串'xxx'

3

>>> f.tell() #再次查看文件指针值,已经变为文件末尾了

31

>>> f.readline() #再读一行,看下是读到eof还是接着读第二行

'tencent\n'

>>> f.readlines() #实际上还是读第二行,并未从文件指针处开始读,而且第二行中也没有之前写入的'xxx',那么'xxx'写到哪里去了呢?把剩下的行全部读出来

['alibaba\n', 'baidu']>>> f.seek(0,0) #剩余的行也没有发现'xxx'。难道是附加在第一行后面吗?通过seek(0,0)把文件指针指到开头

0>>> f.readlines() #读整个文件

['google\n', 'tencent\n', 'alibaba\n', 'baiduxxx']>>> #最初写入的'xxx'其实是被附加到了文件末尾。说明用r+打开文件后,先用f.readline()读行,再f.write('xxx')的方式不能将字符串写入文件指针所在位置;而且,在write后是先写内存,并没有真的写进文件中,这时候readlines()是读不出来的,当执行f.seek()后readlines()才能读出。读出也不代表commit,真正的物理写入是在执行f.close()才发生的

>>> f.seek(0,0) #将文件指针置回开头

0>>> f.write('bbb') #文件指针在开头的初始状态下使用write()方法写入字符串

3

>>> f.tell() #查看文件指针位置,经过write()处理后,指针是否又到末尾了呢?

3

>>> f.seek(0,0) #发现这次write()之后,指针并没有指到末尾,而是在文件开头.那么将指针指回0,后续再读整个文件,看写入的效果

0>>>f.readlines()

['bbbgle\n', 'tencent\n', 'alibaba\n', 'baiduxxx']>>> #'bbb'写到了文件开头,且是覆盖写,而不是插入。

>>> importos>>> print(os.SEEK_SET,os.SEEK_CUR,os.SEEK_END) #文件的起始位置,当前位置,结束位置常量

0 1 2

>>> f.seek(5,os.SEEK_SET) #将文件指针直接指到5

5

>>>f.tell()5

>>> f.write('ttt') #再试一次,看看在没有执行readline情况下,调整指针位置后再write()的效果

3

>>>f.tell()8

>>>f.seek(0,0)

0>>>f.readlines()

['bbbgltttencent\n', 'alibaba\n', 'baiduxxx']>>> #'ttt'竟然是从第5位开始写的!说明write()也可以在文件中间实现覆盖写,而不仅仅是在开头覆盖写或文件末尾附加写,但是前提是打开文件后不能readline,而要直接设置指针位置后调用write()

>>> #总结:r+模式下,write()不能实现插入写,它总是覆盖写或附加写。如果文件一打开即write(),则从开头覆盖写;如文件打开后执行了readline(),然后再调用write(),实现的是附加写

a+模式:

>>> f = open(r'python/file/companies.txt','a+') #a+打开

>>> f.tell() #初始指针位置

28

>>> #初始指针已经指向末尾

>>> f.readline() #读一行, eof,读不到数据

''

>>> f.write('aaa') #写数据

3

>>> f.seek(0,0) #指针重置

0>>> f.readlines() #读所有行

['google\n', 'tencent\n', 'alibaba\n', 'baiduaaa']>>> #'aaa'被附加到末尾了。这点和r+打开文件不同,r+打开文件后执行write()是从开头覆盖写

>>> f.seek(5,0) #文件指针从文件起始位置正向偏移5

5

>>>f.tell()5

>>> f.write('bbb') #再试试写,看是从位置5开始写还是从末尾附加

3

>>> f.seek(0,0) #重置指针

0>>> f.readlines() #读所有行

['google\n', 'tencent\n', 'alibaba\n', 'baiduaaabbb']>>> #'bbb'附加在末尾,说明即使指定了文件指针位置,a+模式下也不会从文件中部写入,始终附加写入

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python 中,可以使用 `open()` 函数打开文件进行读写操作。`open()` 函数常用的模式参数包括:`r`、`r+`、`w`、`w+`、`a` 和 `a+`。它们的区别如下: - `r`(只读模式):打开文件并读取内容,如果文件不存在则会抛出异常。 - `r+`(读写模式):打开文件以读取和入内容,如果文件不存在则会抛出异常。 - `w`(只模式):打开文件入内容,如果文件已存在则覆盖原内容,如果文件不存在则创建新文件。 - `w+`(读写模式):打开文件以读取和入内容,如果文件已存在则覆盖原内容,如果文件不存在则创建新文件。 - `a`(追加模式):打开文件以追加内容,如果文件不存在则创建新文件。 - `a+`(读写模式):打开文件以读取和追加内容,如果文件不存在则创建新文件。 下面是使用这些模式进行文件读写示例代码: ```python # 文件 with open('test.txt', 'w') as f: f.write('Hello, world!') # 读取文件 with open('test.txt', 'r') as f: content = f.read() print(content) # 在文件末尾追加内容 with open('test.txt', 'a') as f: f.write('\nThis is a new line.') # 读取文件 with open('test.txt', 'r') as f: content = f.read() print(content) ``` 上述代码会在当前工作目录下创建一个名为 `test.txt` 的新文件入内容 `Hello, world!`,然后再次打开文件读取内容并输出,接着使用追加模式在文件末尾添加一行新内容,最后再次读取文件并输出。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值