💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
* 作者:煮酒品茶 tea * 博客:http://www.zwhset.com http://cwtea.blog.51cto.com * 目前在京峰教育担任python讲师 #0、文件函数open() 有时我们需要打开文件,或读或写入或追加文件。这时我们就需要用到open()函数。 需要注意的点: > 写文件和追加文件的区别,如果要追加文件使用a模式,w模式会替换掉文件内容。 > 缓冲机制的问题。 > 关闭文件的问题,可采用with环境管理协议。 > 如果用w模式去打开一个文件,然后你是读不了的,这时候合理利用rw r+w这种方式 #1、函数原型 ~~~ open(...) #打开一个文件,得到一个文件对象 open(name[, mode[, buffering]]) -> file object 参数: name:文件名,接收字符串类型,注意windows与类unix的 **\\**问题,windows可用r来抑制**\\**的转义 mode:打开模式,常见的有: w : 写入模式 注意会覆盖文件内容,如果需要追加则使用 a 模式 r : 只读模式 a : 追加模式 b : 二进制模式 常见的图片、视频、word等文件 + : 多种存在 buffering : 是否缓冲,注意这是python级的,内核级也有一个缓冲机制。 0:不缓冲 1: 缓冲 #open()函数使用file()函数对象,上面的具体说明可以使用file.__doc__来查看file的说明。基本上也就是我们看到的上面的一些东西。 Open a file using the file() type, returns a file object. This is the preferred way to open a file. See file.__doc__ for further information. ~~~ #2、样例 ##2.1、可使用with环境管理协议 ~~~ with open('a.txt') as f: pass ~~~ ##2.2、exp 文件初始内容: ~~~ # cat t1.txt nihao,I'm zwhset I love you ~~~ 读文件: > open的读文件方法一共有三个,read() readline() readlines(),这三个方法都会保留换行符。 * read()方法针对字符,可用size来限定读取个数 * readline()方法针对行,可用size来聚宝读取行内字符的个数 * readlines() 返回列表 ~~~ read(...)原型 #返回给定size的内容,size是可选的 read([size]) -> read at most size bytes, returned as a string. #如果给定一个size参数则返回size的大小,在非阻塞模式下给的size过大会变取所有直到EOF #如果size未给则默认读取所有,直接EOF ~~~ ~~~ readline(...)原型 #读取文件下一行,返回一个字符串 readline([size]) -> next line from the file, as a string. #此方法针对的字符串,也就是说你给定size返回整个内容的size个数 #此方法是一个生成器对象 #此方法size过大则全读完 注意:此方法针对行,如果行内未读完一直生成下去,也就是说如果size给定大于一行内的字符串个数也只会返回此行的个数 ~~~ ~~~ readlines(...)原型 #返回一个列表 readlines([size]) -> list of strings, each a line from the file. #重复调用readline方法,如果给定size,则这个size是给定readline(size),类我们的列表解析 注意:这个方法好像没什么用。 ~~~ **READ方法** ~~~ In [16]: f = open('t1.txt','r') # 打读模式打开个文件对象 In [17]: f.read() # 一次性全读完,返回字符串对象 Out[17]: "nihao,I'm zwhset\nI love you\n" In [19]: f = open('t1.txt','r') ~~~ ~~~ In [42]: f = open('/etc/passwd','r') In [43]: f.read(100) #读取100个字符 Out[43]: 'root:x:0:0:root:/root:/bin/bash\nbin:x:1:1:bin:/bin:/sbin/nologin\ndaemon:x:2:2:daemon:/sbin:/sbin/nol' In [44]: len(f.read(100)) # 测试大小 Out[44]: 100 ~~~ **READLINE方法** ~~~ In [20]: f.readline() # 生成器方法一次只返回一个结果 Out[20]: "nihao,I'm zwhset\n" In [21]: f.readline() Out[21]: 'I love you\n' In [22]: f.readline() # 生成器元值则返回空对象 Out[22]: '' ~~~ **READLINES方法** ~~~ In [45]: f = open('/etc/passwd','r') In [46]: f.readline(10) # 读取这行10个字符 Out[46]: 'root:x:0:0' In [47]: f.readline(10) # 继续读取这一行的10个字符 Out[47]: ':root:/roo' In [48]: f.readline(10) Out[48]: 't:/bin/bas' In [49]: f.readline(10000) # size过大,读取一行余下的字符 Out[49]: 'h\n' In [50]: f.readline(10000) # size过大,读取一行所有的字符 Out[50]: 'bin:x:1:1:bin:/bin:/sbin/nologin\n' ~~~ ~~~ In [24]: f = open('t1.txt','r') In [25]: f.readlines() # 以行为元素,得到一个列表,列表的元素为字符串。 Out[25]: ["nihao,I'm zwhset\n", 'I love you\n'] In [67]: f = open('/etc/passwd','r') In [68]: f.readlines(2)[:3] #size为2,并只取分片取3个元素。好像不起啥作用? Out[68]: ['root:x:0:0:root:/root:/bin/bash\n', 'bin:x:1:1:bin:/bin:/sbin/nologin\n', 'daemon:x:2:2:daemon:/sbin:/sbin/nologin\n'] ~~~ 写文件: ~~~ In [27]: f = open('t1.txt','w') In [28]: f.write('woyehao') In [29]: f.flush() In [30]: f = open('t1.txt','w') In [32]: list = ['ni','wo','ta'] In [33]: f.write f.write f.writelines In [33]: f.writelines(list) In [34]: f.flush() ~~~ 煮酒品茶:未完待续