【python】open函数⽂件操作读、写和转义符‘n’
1、open()语法
open(file[, mode[, buffering[, encoding[, errors[, newline[, closefd=True]]]]]])
open函数使⽤⼀个⽂件名作为唯⼀的强制参数,然后返回唯⼀的⽂件对象。
open:函数有很多的参数,常⽤的是file,mode和encoding;
file:⽂件位置,需要加引号;
mode⽂件打开模式,有读、写;
buffering的可取值有0,1,>1三个,0代表buffer关闭(只适⽤于⼆进制模式),1代表line buffer(只适⽤于⽂本模式),>1表⽰初始
化的buffer⼤⼩;
encoding表⽰的是返回的数据采⽤何种编码,⼀般采⽤utf8或者gbk;
errors的取值⼀般有strict,ignore,当取strict的时候,字符编码出现问题的时候,会报错,当取ignore的时候,编码出现问题,程序会
忽略⽽过,继续执⾏下⾯的程序。
newline可以取的值有None, \n, \r, ”, ‘\r\n’,⽤于区分换⾏符,但是这个参数只对⽂本模式有效;
2、 Python中file()与open()区别
两者都能够打开⽂件,对⽂件进⾏操作,也具有相似的⽤法和参数,但是,这两种⽂件打开⽅式有本质的区别,file为⽂件类,⽤file()来打
开⽂件,相当于这是在构造⽂件类,⽽⽤open()打开⽂件,是⽤python的内建函数来操作,建议使⽤open;
3、⽂件打开—转义符的使⽤
复制⽂件的路径,打开⽂件:
In [1]: open('C:\Users\BruceWong\Documents\out.log')
File"<ipython-input-7-6f95fbc44d0c>", line 1
open('C:\Users\BruceWong\Documents\out.log')
^
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape
出现打开错误,直接复制路径打开报错,是因为”\”符号在python中会被视为转义符,此时传⼊的路径就出现差错;那我们可以采取修改
路径的⽅式,将”\”改为”/”:
writelines方法的参数可以是In [8]: open('C:/Users/BruceWong/Documents/out.log') #将"\"改为"/"使得路径能正确识别
Out[8]: <_io.TextIOWrapper name='C:/Users/BruceWong/Documents/out.log' mode='r' encoding='cp936'>
或者使⽤最常规的操作:在含有转义符的字符串前加‘r’表⽰字符串内按原始含义解释,不做转义处理;这⾥的r相当于正则表达的操作;
In [2]: open(r'C:\Users\BruceWong\Documents\out.log')
Out[2]: <_io.TextIOWrapper name='C:\\Users\\BruceWong\\Documents\\out.log' mode='r' encoding='cp936'> #open函数默认的打开⽂件的模式是只读。
4、参数mode⽂件打开模式的基本取值常见的打开模式如图:
常见的mode取值组合:
r或rt 默认模式,⽂本模式读
rb ⼆进制⽂件
w或wt ⽂本模式写,打开前⽂件存储被清空
wb ⼆进制写,⽂件存储同样被清空
a 追加模式,只能写在⽂件末尾
a+ 可读写模式,写只能写在⽂件末尾
w+ 可读写,与a+的区别是要清空⽂件内容
r+ 可读写,与a+的区别是可以写到⽂件任何位置
r:打开⽂件只读模式,查看⽂件内容
#打开⽂件只读模式,查看⽂件内容
In [1]: art = open(r'C:\Users\BruceWong\Documents\out.log')
In [2]: adlines()
Out[2]: ['Hello,Python\n', 'IM Bruce\n', 'This is a test file\n'] w:打开写⼊write模式,重新写⼊的内容会替代原内容
#打开写⼊write模式,重新写⼊的内容会替代原内容
In [3]: art1 = open(r'C:\Users\BruceWong\Documents\out.log','w')
#写⼊新的内容,返回内容的长度
In [4]: art1.write('doing best')
Out[4]: 10
#当重新写⼊后不能调⽤readlines来读取,必须先声明⽂件为读取的模式才⾏
In [5]: adlines()
---------------------------------------------------------------------------
UnsupportedOperation Traceback (most recent call last)
<ipython-input-5-404b009bb145> in <module>()
----> adlines()
UnsupportedOperation: not readable
#对⽂件操作后,要关闭⽂件
In [6]: art1.close()
#查看art1
In [7]: art1
Out[7]: <_io.TextIOWrapper name='C:\\Users\\BruceWong\\Documents\\out.log' mode='w' encoding='cp936'> #打开⽂件可读模式读取⽂件
In [8]: art1 = open(r'C:\Users\BruceWong\Documents\out.log','r')
#读取⽂件的每⼀条
In [9]: adlines()
Out[9]: ['doing best']
In [10]: art1.close()
#再次对⽂件进⾏写模式下的操作
In [11]: art1 = open(r'C:\Users\BruceWong\Documents\out.log','w')
#write函数只能调⽤⼀个参数
In [12]: art1.write('aaa','bbb')
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-12-f3c3691c1587> in <module>()
----> 1 art1.write('aaa','bbb')
TypeError: write() takes exactly one argument (2 given)
#writelines也只能调⽤⼀个参数
In [13]: art1.writelines('aaa','bbb')
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-13-f44e5da5c42a> in <module>()
----> 1 art1.writelines('aaa','bbb')
TypeError: writelines() takes exactly one argument (2 given)
#如果想写⼊多⾏,需要将写⼊的⽂件采⽤换⾏符的操作即可
In [14]: art1.write('aaa\nbbb')
Out[14]: 7
In [15]: art1.close()
In [16]: art1 = open(r'C:\Users\BruceWong\Documents\out.log','r') #查看新的⽂件的内容
In [17]: adlines()
Out[17]: ['aaa\n', 'bbb']
In [18]: art1.close()
#亦可以通过迭代的⽅式:
In [24]: test = [ "test1\n", "test2\n", "test3\n" ]
...: f = open(r'C:\Users\BruceWong\Documents\out.log','w')
...: for i in test:
...: f.write(i)
...: f.close()
In [30]: f = open(r'C:\Users\BruceWong\Documents\out.log','r')
In [31]: f.readlines()
Out[31]: ['test1\n', 'test2\n', 'test3\n']
a:打开添加模式,但是添加的内容在⽂尾
#添加⼀个或者使⽤换⾏符添加多个
In [19]: art1 = open(r'C:\Users\BruceWong\Documents\out.log','a')
In [20]: art1.write('rrr')
Out[20]: 3
In [21]: art1.close()
In [22]: art1 = open(r'C:\Users\BruceWong\Documents\out.log','r')
In [23]: adlines()
Out[23]: ['aaa\n', 'bbbrrr']
#迭代添加多个
In [33]: test = [ "test1\n", "test2\n", "test3\n" ]
...: f = open(r'C:\Users\BruceWong\Documents\out.log','a')
.
..: for i in test:
...: f.write(i)
...: f.close()
...:
#查看添加结果
In [34]: f = open(r'C:\Users\BruceWong\Documents\out.log','r')
In [35]: f.readlines()
Out[35]: ['test1\n', 'test2\n', 'test3\n', 'test1\n', 'test2\n', 'test3\n']
In [36]: f.close()
r+:在写⼊⽂件前,我们在上⾯那段代码中加上⼀句f.seek(0),⽤来定位写⼊⽂件写⼊位置(⽂件开头),直接覆盖字符数(注意\n也是⼀个字符)
f.seek(n)将在n位置写⼊
In [37]: test = [ "book\n", "joke2\n", "fang3\n" ]
...: f = open(r'C:\Users\BruceWong\Documents\out.log','r+')
...: for i in test:
...: f.seek(0)
...: f.write(i)
...: f.close()
In [38]: f = open(r'C:\Users\BruceWong\Documents\out.log','r')
#由于迭代时,每次都会判断初始位置并将第⼀个元素重新写⼊
In [39]: f.readlines()
Out[39]: ['fang3\n', 'test2\n', 'test3\n', 'test1\n', 'test2\n', 'test3\n']
In [40]: f.close()
#将test所有的元素添加到开头
In [41]: test = [ "book\n", "joke2\n", "fang3\n" ]
...: f = open(r'C:\Users\BruceWong\Documents\out.log','r+')
...: f.seek(0)
...: for i in test:
...: f.write(i)
...: f.close()
In [42]: f = open(r'C:\Users\BruceWong\Documents\out.log','r')
In [43]: f.readlines()
Out[43]: ['book\n', 'joke2\n', 'fang3\n', '\n', 'test1\n', 'test2\n', 'test3\n']
In [44]: f.close()
5、其他测试
In [45]: f = open(r'C:\Users\BruceWong\Documents\out.log','r')
#读取整个⽂件,字符串显⽰
In [46]: f.read()
Out[46]: 'book\njoke2\nfang3\n\ntest1\ntest2\ntest3\n'
#指针在⽂件末尾,不能再读取内容
In [47]: f.read()
Out[47]: ''
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论