Python中文件和目录操作

命令汇总

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import os
import shutil
os.getcwd()  # 获取当前工作目录,非脚本目录
os.listdir()  # 返回指定目录下的所有文件和目录,非递归
os.remove()  # 删除文件
os.removedirs()  #删除目录
os.path.isfile()  # 检验给出的路径是否是一个文件
os.path.isdir()  # 检验给出的路径是否是一个目录
os.path.isabs()  # 判断是否是绝对路径
os.path.exists()  # 检验给出的路径是否真实存在
os.path.split()  # 返回一个路径的目录名和文件名
os.path.splitext()  # 分离文件扩展名
os.path.dirname()  # 获取文件路径名
os.path.basename() # 获取一个绝对路径下的文件名
os.system()  # 运行shell命令
os.rename(old,new) # 重命名文件或目录
os.makedirs(r"c:\python\test")  # 创建多级目录
os.mkdir("test")  # 创建单个目录
os.exit()  # 终止当前进程
os.path.getsize(filename)  # 获取文件大小
os.mknod("test.txt")  # 创建空文件
shutil.copyfile("oldfile","newfile")  # oldfile和newfile都只能是文件
shutil.copytree("olddir","newdir")  # olddir和newdir都只能是目录,且newdir必须不存在
shutil.move("oldpos","newpos")  # 移动文件或目录
shutil.rmtree("dir")  # 删除目录,与os.removedirs()相同
os.path.join(“home”, "me", "mywork")  # 路径连接

常用命令

1. 获取目录中的文件名os.listdir(dir_name)

1
2
3
4
5
import os
#获取当前目录中的文件名
os.listdir('.')
#获取当前目录中的.vtt文件
vttFileNameList = [f for f in os.listdir('.') if '.vtt' in f]

2. 获取当前路径os.getcwd()

1
2
3
4
5
6
# 当前路径
sys.path[0]
sys.argv[0]
os.getcwd()
os.path.abspath(__file__)
os.path.realpath(__file__)

3. 创建目录os.mkdir(dir_name)或os.makedirs(dir_name)

1
2
3
4
5
6
7
创建单个目录
import os
os.mkdir('public')

创建多级目录
import os
os.makedirs('public/attachment/201706/21/16')

4. 返回文件或目录是否存在

1
2
3
4
os.path.exists(fileName)   
import os
if not os.path.exists('foldername'):
  os.mkdir('foldername')

5. 删除目录或文件

1
2
3
4
5
6
7
8
9
os.remove(p)
os.rmtree(p)  
def del_dir_or_file(p):
if os.path.isdir(p):
    os.rmtree(p)
    print "delete dictionary %s" % p
else if os.path.isfile(p):
    os.remove(p)
    print "delete file %s" % p

6. 添加path环境变量

1
2
# 用于加载非本目录的模块
sys.path.append('..')

7. 目录拼接

1
os.path.join(dir_name, file_name)

8. 移动文件

1
2
3
4
5
6
shutil.move
shutil.copyfile("oldfile","newfile")  # oldfile和newfile都只能是文件
shutil.copytree("olddir","newdir")  # olddir和newdir都只能是目录,且newdir必须不存在
shutil.move("oldpos","newpos")  # 移动文件或目录
shutil.rmtree("dir")  # 删除目录,与os.removedirs()相同
os.path.join("home”, "me", "mywork")  # 路径连接

9. 判断是文件还是目录os.path.isdir()和os.path.isfile()

1
2
3
import os
os.path.isdir(filename)
os.path.isfile(filename)

10. 执行shell命令

  • os.system(cmd)的返回值只会有0(成功),1,2
  • os.popen(cmd)会吧执行的cmd的输出作为值返回
  • subprocess.call()
1
2
3
4
5
6
7
8
9
# 代码示例:
比如,我想得到ntpd的进程id,就要这么做:
os.popen('ps -C ntpd | grep -v CMD |awk '{ print $1 }').readlines()[0]
获取执行dir命令的返回内容
os.popen('dir').readlines()

from subprocess import call
command = "youtube-dl https://www.youtube.com/watch?v=NG3WygJmiVs -c"
call(command.split(), shell=False)

复杂应用

1. 读取目录下所有TXT文件,并写入TXT文档中

1
2
3
4
5
6
7
8
9
10
11
12
13
import os
def write_txt(dist, big_txt):
    with open("{}{}".format(big_txt,".txt"), "a") as fw:
        lines = []
        for file in os.listdir(dist):
            file_path = r"{}\{}".format(dist,file)
            if os.path.isfile(file_path) and file.endswith(".py"):
                with open(file_path, "r") as fr:
                    lines = lines + fr.readlines()
        for line in lines:
            fw.write(line)
        
write_txt('G:\Work\workspace_python\selenium','111')

2. 日志记录

1
2
3
4
5
6
7
import datetime, time
def write_log(log_str):
    curr_day = datetime.date.today().strftime('%Y-%m-%d')
    curr_time = time.strftime('%H:%M:%S')
    with open('log.txt', 'a') as f:
        f.write("{}{}{} \n".format(curr_day, curr_time, log_str))
write_log('testsetst')

3. 使用Python批量重命名文件

使用的函数

  • os.listdir(‘.’) #列出目录中所有文件名
  • os.path.join(path, file_name) #拼接完整文件名
  • os.path.isdir(file_name) #判断是否是目录
  • os.path.splittext(file_name) #分离文件名[0]和扩展名[1]
  • os.rename(old_name, new_name) #重命名文件
1
2
3
4
5
6
import os
path = r"I:\desktop\Python"
for file in os.listdir(path):
    new_name = file.replace('51CTO下载-', '')
    os.rename(os.path.join(path, file), os.path.join(path, new_name))
    print(os.path.join(path, new_name))

4. 判断文件内容是二进制还是文本

1
2
3
4
def is_binary_string(bytes):
    textchars = bytearray({7, 8, 9, 10, 12, 13, 27} | set(range(0x20, 0x100)) - {0x7f})
    return bool(bytes.translate(None, textchars))
is_binary_string(open(filename, 'rb').read(1024))