python中的文件、目录操作
在编写代码的过程中,如果存在读取,写入等操作的时候,就免不了与open函数、os库打交道,最近使用pandas有点勤,其中也用了不少的os函数,所以在这里做个总结:
-
关于open的使用
open(name[, mode[, buffering]])
首先需要了解一点,在现代操作系统,不允许普通的程序直接操作磁盘,所以就有了文件对象(文件描述符)的产生,而open函数是python内置的函数,不需要import module
文件操作:读文件、写文件、关闭文件、偷懒的with
1.读文件(文件读到内存中)f = open('/Users/Sonder/test.txt', 'r') ` #读取非utf-8文件使用encoding关键字参数 f = open('/Users/Sonder/gbk.txt', 'r', encoding='gbk') #文件中存在编码不规范的情况(乱码) ,使用errors关键字参数 f = open('/Users/Sonder/gbk.txt', 'r', encoding='gbk', errors='ignore') f.read() read(size) #如果文件过大 可以使用size f.readline() f.readlines() 如果使用read多次,那么后面读取的数据是从上次读完后的位置开始的 例如: f = open('hello.txt', 'r') #假设txt文本中只有一行字 hello world,I am Sonder! content = f.read(5) print(content) print('*'*10) content = f.read() print(content) f.close() >>> hello ********** world,I am Sonder!
2.写文件
mode r-->w
f = open('/Users/Sonder/test.txt','w') f.write('Hello, world!')
注意,写文件时,操作系统往往不会立刻把数据写入磁盘,而是放到内存缓存起来,空闲的时候再慢慢写入。只有调用close()方法时,操作系统才保证把没有写入的数据全部写入磁盘。
3.关闭文件
f.close()
文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的,可以使用try ... finally保证无论是否出错都能正确地关闭文件。4.使用
with
关键字规避异常(with可以自动调用close方法)with open('/path/file_name', 'r') as f: print(f.read())
5.文件操作还包括有获取文件读写的位置
tell()
,定位到某个位置seek(offset, from)
,不过自己目前都不太常用,记住有这些操作就行。
另外文件的读写mode不止有r和w,还包括有b
,a
,+
,只要记住b是二进制,+是读写均可,a是追加,等到用的时候合理使用即可。
-
关于os库的使用
第一步,导入os库import os
os的常用操作:
1.查看当前目录os.getcwd()
插一句,在 jupyter notebok cell中直接输入pwd效果一样
2.创建目录mkdir & makedirs
os.mkdir('/Users/Sonder/a') os.makedirs('/Users/Sonder/a') #os.makedirs会递归的建立输入的路径,即使是上层的路径不存在, #它也会建立这个路径,而os.mkdir父级路径不存在,那么就会报错。 #而且mkdir不能创建已经存在的目录,而makedirs可以通过exist_ok关键字参数 #设置exist_ok=True表示若目录存在着不抛出任何错误
2.(常用)获取目录下的文件名
os.path.listdir(folder_name)
3.(常用)目录的拼接os.path.join(folder_name1,folder_name2,...)
把多个路径合成一个时,不要直接拼字符串的拼接(虽然效果一样),而要通过os.path.join()
函数,这样可以正确处理不同操作系统的路径分隔符,或者一定使用字符串的拼接也可以,不过不要简单粗暴的使用folder_name1 + '/' + folder_name2
,可以尝试用下面这种方法folder_name1 + os.sep + folder_name2
,os.sep
表示该操作系统的分隔符。
4.一个完整路径下的文件名称获取os.path.basename(file_path)
5.删除文件os.remove(file_path)
一般情况下防止异常会这么写:
if os.path.exists('hello_world.txt'):
os.remove('hello_world.txt')
目前自己用到的就以上这些,如果之后遇到常用的再进行补充,自己常常结合2、3操作获取一个文件夹下所有文件绝对路径的获取,代码如下:
import os
files_set = os.path.listdir(folder_name)
files_abs_path_set = []
for i in range(len(files_set)):
files_abs_path_set.append(os.path.join(folder_name,files_set[i]))
更简单的写法如下:
import os
files_abs_path_set = os.path.listdir(folder_name)
files_abs_path_set = [ os.path.join(folder_name,i) for i in files_abs_path_set ]
#使用list comprehension
~~~~~
比满足别人期待更重要的是,满足自己的期待。
~~~~~