【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中会被视为转义符,此时传入的路径就出现差错;那我们可以采取修改路径的方式,将”\”改为”/”:

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]: art.readlines()
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]: art1.readlines()
---------------------------------------------------------------------------
UnsupportedOperation                      Traceback (most recent call last)
<ipython-input-5-404b009bb145> in <module>()
----> 1 art1.readlines()
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]: art1.readlines()
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]: art1.readlines()
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]: art1.readlines()
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、其他测试
f.read()读取整个文件

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]: ''

f.readline()读取一条一条的信息

In [49]: f = open(r'C:\Users\BruceWong\Documents\out.log','r')
In [50]: f.readline()
Out[50]: 'book\n'
In [51]: f.readline()
Out[51]: 'joke2\n'
In [52]: f.readline()
Out[52]: 'fang3\n'
In [53]: f.close()

f.readlines()读取所有的信息,返回元素列表

In [54]: f = open(r'C:\Users\BruceWong\Documents\out.log','r')
In [55]: f.readlines()
Out[55]: ['book\n', 'joke2\n', 'fang3\n', '\n', 'test1\n', 'test2\n', 'test3\n']
In [56]: f.close()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值