(廖雪峰)Python学习笔记五-IO与文件

###文件读写###
IO和文件读写是最常见的操作,Python内置了和C兼容的文件读写函数。
基本流程
主要通过open函数,可在里面做一些配置:
f = open('/Users/michael/test.txt', 'r')
传入的是路径和标志符。

然后读或者写
f.read()
f.write(xxx)

最后必须关闭
f.close();

在读写文件的过程中很容易发生异常,发生异常后文件句柄不能关闭,会导致资源泄露或者资源占用。所以都要包裹到try…catch…finally 中处理文件读写,这也是基本的编程知识规范了。Python提供了简洁的语法,不用再try…catch…finnally写一大堆了。

with open('xxx/xxx/xx.xx', r) as f:
	print(f.read())

如果还想要捕捉异常直接try…catch… 包裹上去就行了,因为内部肯定是直接把异常抛出来的。

可以传入的参数
注意只是写文件相关如w的话,如果文件存在,原来的文件会被删除,不被删除的是传入a。
可以传入的参数列表

ab
‘r’
‘w’
‘a’追加
‘r+’ == r+w(可读可写,文件若不存在就报错(IOError))
‘w+’ == w+r(可读可写,文件若不存在就创建)
‘a+’ ==a+r(可追加可写,文件若不存在就创建)

对应的,如果是二进制文件,就都加一个b就好啦:
‘rb’  ‘wb’  ‘ab’  ‘rb+’  ‘wb+’  ‘ab+’

读写数量的控制:
直接用read()会把整个文件读到内存中,这对于大文件是不行的,所以需要进行控制。结果都是以string方式存在,List中放的也是string
read(int bytes)可以控制读多少个字节进来。
readline() 读取一行
readlines()读取所有内容并返回list
结束的判断,如果返回值为空'',就表示读取到了文件末尾。
同样的 write也提供了writeline()

字符编码
传入命名关键字参数 encoding='gbk' 即可,度或者写都有效

文件指针移动
seek(offset,whence=0)方法用来在文件中移动文件指针。offset表示偏移多少。可选参数whence表示从哪里开始偏移,默认是0为文件开头,1为当前位置,2为文件尾部

类文件对象 file-like Object
类文件对象,就是提供read方法的对象。基于Python的鸭子类型,不用继承特别的类,只需要提供这个方法,就可以看做类文件对象了。常用在字节流,网络流,自定义流等中。

StringIO 和 BytesIO

 from io import StringIO
 f = StringIO()
 # 然后f.xxx 各种函数操作即可
 f.write('12234') #会返回写入数量
 f.getvalue() #得到字符串值
 s = f.readline()

BytesIO的操作基本一样

 from io import BytesIO
f = BytesIO()
# f = BytesIO('0xED0x350xE4')可以进行初始化
f.write('中文'.encode('utf-8'))
print(f.getvalue())

###操作文件和目录
Python提供的文件操作函数一部分在os中,一部分在Path中,因为部分文件操作是有操作系统os提供的。
一些操作系统的功能
os.name # 操作系统的体系,如果等于posix 就是unix系的,包括Linux、Unix、Mac等。
windows的名为nt
os.uname() 获取操作系统的详细信息,目前windows上面没有提供

os.eviron 获取操作系统的环境变量
如果要获取某个具体的环境变量,使用os.environ.get('key')
操作文件和目录
os.mkdir(‘xxx’) #创建目录
os.rmdir(‘xxx’) #删除目录
os.rename(‘xxx’, ‘xxx’) #重命名文件
os.remove(‘xxx’) # 删除文件
复制文件的函数居然在os模块中不存在,因为操作系统没有提供这个功能,Python中在shutil模块提供了copyfile()的函数,还可以在shutil模块中找到很多实用函数,它们可以看做是os模块的补充

路径、文件名相关

注意一个比较坑的地方,python里面的相对路径,用的是启动运行的那个脚本的相对路径,而不是当前代码所在脚本的相对路径
os.path.absPath(xxx) # 绝对路径
os.path.join(‘xxx’, ‘xxx’) #合并出一个新的路径,会自动添加文件路径分隔符,不要自己添加,不同体系的os的分隔符不同,很麻烦。
os.path.spilt(‘xxx’) #反过来,将文件名和父路径分开,返回两个元素的列表, 可以用os.path.splitext(pic_url)[-1] 快速获取文件后缀
os.splitext(‘xxx’) #将文件后缀和前面的内容分开

路径比较坑的另一个地方是,open(‘xxx’, 'xx) 方法中,文件名有很多非法字符,这些字符和window或者linux并不完全一样,应该是没有两者并集,然后没有做特殊处理,因此会遇到明明在windows里面没问题的文件名,传入这个方法却报错的问题。

过滤文件
最后看看如何利用Python的特性来过滤文件。比如我们要列出当前目录下的所有目录,只需要一行代码:

>>> [x for x in os.listdir('.') if os.path.isdir(x)]
['.lein', '.local', '.m2', '.npm', '.ssh', '.Trash', '.vim', 'Applications', 'Desktop', ...]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值