【这是googpy的第56篇原创】
昨天文章结尾的时候,我说Python使用seek函数报错:io.UnsupportedOperation:can’t do nonzero end-relative seeks,解决的办法是在open函数里加入“rb”,大家觉得原因是什么呢?
我下去查了一下,这个问题主要是由Python2和Python3的区别造成的,换言之,如果在Python2中是不会报错的,但在Python3中则会报错。因为Python3在文本文件中,没有使用b模式选项打开的文件,只允许从文件头开始计算相对位置,如果从文件尾计算就会引发异常。
文件处理这部分内容多而杂,看书的话又抓不住重点,下面我把自己学习过程中觉得重要的、经常用到的内容写出来,和大家一起学习一下。
文件的重命名和删除文件
Python的os模块提供了执行文件处理操作的方法,比如说重命名和删除。要使用这个模块,首选要导入它,然后才能调用相关的功能。
1)重命名文件
rename()方法,语法:
os.rename(current_file_name, new_file_name)
需要两个参数,当前的文件名和新文件名
例:将一个已经存在的test1.txt文件重命名为test2.txt
import os
# 重命名文件test1.txt到test2.txt。
os.rename( "test1.txt", "test2.txt" )
2)删除文件
remove()方法,语法:
os.remove(file_name)
需要提供要删除的文件名作为参数
例:删除一个已经存在的test2.txt文件
import os
# 删除一个已经存在的文件test2.txt
os.remove("test2.txt")
但是在删除之前,最好先判断test2.txt文件是否存在,即在上面代码前加入:
if os.path.exists('test2.txt'):
os.remove('test2.txt')
创建并访问目录
这里依然用到OS模块,即使所有文件都包含在各个不同的目录下,Python的os模块也能轻松处理,帮你创建、删除和更改目录。
1)创建目录
mkdir()方法,语法:
os.mkdir("newdir")
在当前目录下创建新的目录,需要提供一个包含将创建目录的名称作为参数
例:在当前目录下创建一个新目录
为了保证思维严谨,最好在创建之前先判断目录是否存在,否则会报错。
import os
if not os.path.exists('test01'):
os.mkdir('test01')
2)列出当前目录下的所有文件和文件夹
import os
print(os.listdir('.'))
如果我们要知道某个成员是文件夹还是文件,可以用下面这种方法:
print(list(os.walk('.')))
3)改变当前目录
chdir()方法,语法:
os.chdir("newdir")
需要提供一个新的目录名称作为参数
例:
import os
# 将当前目录改为"/home/newdir"
os.chdir("/home/newdir")
4)显示当前目录
getcwd()方法,语法:
os.getcwd()
例:
import os
# 给出当前的目录
os.getcwd()
5)删除目录
rmdir()方法,语法:
os.rmdir('dirname')
目录名称以参数传递。需要注意的是,在删除当前目录之前,它的所有内容应该先被清除。
例:
import os
# 删除”/tmp/test”目录
os.rmdir( "/tmp/test" )
判断是否为文件或目录
这部分内容,我看网上也有将os.path()模块所有的方法都进行总结的,总结的很好,如果我这里再给出来,意义不大。我们平时写代码的时候可以根据需求,查表格就可以了。
那么我想说的是,在文件处理我的时候,特别是递归处理目录下的多个文件或者嵌套子目录的时候,要先判断一下这个是文件还是目录。
1)判断是否为文件
print os.path.isfile('test01')
>>False
2)判断是否为目录
print os.path.isdir('test01')
>>True
3)判断文件或者目录是否存在,有的时候我们不在乎这个到底是文件还是路径,我们只关心它是否存在,有个简便的方法:
print os.path.exists('test01')
>>True
最后,可能大家看一篇文章只要3、5分钟,而我却要花50-100倍的时间去准备去写,虽然在学校时间相对多一点,但是毕竟还要做课题研究,要毕业。