python中文件读取中r,r+之间的区别
2018-11-20 本文已影响49人
yuanCruise
0.注意事项
1.如果想要把下面介绍的代码跑通,都需要把准备动作部分代码加上。比如你想测试下w,那就在w部分代码前面把准备动作部分(部分1)的代码加上。
2.本文中用到r的时候请使用read(),读取的时候有三种读取方式,下面简单介绍一下:
- file.read():每次读取整个文件,它通常用于将文件内容放到一个字符串变量中。如果文件大于可用内存,则不可能实现这种处理。而且如果要对文件进行按行读取进行操作的话,就要用下面两个了。
- file.readline():每次只读取一行,通常比 .readlines() 慢得多。仅当没有足够内存可以一次读取整个文件时,才应该使用 .readline()。
- file.readlines():一次读取整个文件,象 .read() 一样。但是返回的是可迭代对象,所以仍然可以按行操作。
1.准备动作
lines = open('head.txt').readlines()
for line in lines:
line = line.strip()
#line中存的head文件中保存的底下的各个txt的名称
#如1.txt/2.txt
#这一段的作用相当于把所有的修改的东西先定义好
#并且存在file_lines里面
#后面用writelines把这整个修改写进文件里面
with open(line) as file:
file_lines = file.readlines()
for i in range(0,len(file_lines)):
file_lines[i] = "0" +" "+ file_lines[i].strip() + " "+"1"+"\n"
#print(file_lines[i])
with xxxx #执行注意事项第一项的时候请把后面的代码加到这个位置。(原理就是请加在for循环里面)
#--------------前面只是利用w,r,w+,r+处理前的基础准备---------
下图展示的上述代码中用到的txt文件具体实例。
2 r 和 r+
#r和r+:
#r:仅仅表示读入
#r+:既可以读取还可以写入
#但r和r+与w,w+不同的是,不会把原先存在txt中的东西清空
#举例说明
with open(line,"r") as file2:
content_read = file2.read()
content_readline = file2.readline()
content_readlines = file2.readlines()
print('content_read:{},content_readline:{},content_readlines:{}'.format(content_read,content_readline,content_readlines))
执行结果如下:
在用r打开一个文件的时候,每读一次标记会往后移动,所以执行上述代码时结果如下。所以当先用read之后,在当前打开的文件中所有东西都被读完了,所以readline和readlines都读不到东西了。
如果先用readline的话,会先读掉一行,让后剩余部分被read读走了。
with open(line,"r") as file2:
content_readline = file2.readline()
content_read = file2.read()
content_readlines = file2.readlines()
print('content_read:{},content_readline:{},content_readlines:{}'.format(content_read,content_readline,content_readlines))
with open(line,"r") as file2:
file2.writelines(file_lines)
content_read = file2.read()
content_readline = file2.readline()
content_readlines = file2.readlines()
执行结果如下:
用r的时候不能用写操作,只能够read。
用r+的时候,首先可以确定的是读入的文件肯定可以进行写操作了,不会再报错了。然而writelines这个语句在read前,还是在后,对最后的结果会有影响。下面先看结果在进行分析。
- writelines在前面
with open(line,"r+") as file2:
file2.writelines(file_lines)
content_read = file2.read()
content_readline = file2.readline()
content_readlines = file2.readlines()
print('content_read:{},content_readline:{},content_readlines:{}'.format(content_read,content_readline,content_readlines))
输出结果:
content_read:,content_readline:,content_readlines:[]
content_read:,content_readline:,content_readlines:[]
文件结果:
- writelines在后面
with open(line,"r+") as file2:
content_read = file2.read()
content_readline = file2.readline()
content_readlines = file2.readlines()
file2.writelines(file_lines)
print('content_read:{},content_readline:{},content_readlines:{}'.format(content_read,content_readline,content_readlines))
输出结果:
content_read:yuanlei
jym,content_readline:,content_readlines:[]
content_read:jym
yuanlei,content_readline:,content_readlines:[]
文件结果:
上述两种结果分析:
首先我们可以发现r+肯定是可以读的这一点,而如果用r+打开文件后,先对writelines写在前面的结果进行分析。
- writelines在前。该种情况属于先用r+打开文件,然后writelines把文件流读进来,首先第一步把原始文件流完全清空,再把file_lines中准备好的写入序列写入到文件中,所以文件展示如上面所示。而read函数输出是空原因就是writelines已经把文件流清空了,而read读取并打印的就是这个文件流,而不是writelines后来写进去的新文件。
- writelines在后。这种情况也很容易理解,首先先用read读取,所以打印的结果和用r打开并read的情况完全相同。而之后再用writelines的时候,他会先清空这个文件流,但是此时文件流在read函数的这里,不在原始文件中,所以文件流没有被writelines是给清空,因此writelines只是把file_lines中的内容添加在了原始文件的后面。(感觉这个read后面跟着一个write的操作,实现的效果很像用a打开文件的效果)
with open(line,"r") as file2:
pass
#或者
with open(line,"r+") as file2:
pass
执行结果如下:
结果就是啥也没有,因为r和r+在打开文件的时候就会不会把文件清空。