OS Python

作者: RayRaymond | 来源:发表于2020-04-26 22:06 被阅读0次
  • os
    [operating system]
    [Python 标准库]

路径

输出运行路径 os.getcwd()

import os

print(os.getcwd())
E:\Myjupyter\老妈工作
  • 路径

Windows 用反斜杠 \

Mac 和 Linux 用斜杠 /

反斜杠在Python中表示转义符 所以可以用 \\

路径连接 os.path.join( ... , ...)

print(os.path.join('A','AI'))
A\AI

绝对路径,相对路径

  • 绝对路径: 根文件夹开始
    • E:\Myjupyter\老妈工作
  • 相对路径: 相对于程序运行的路径
    • .\ ...

输出当前程序文件夹下所有文件和文件夹 os.listdir()

print(os.listdir())
['.ipynb_checkpoints', 'OS.ipynb', 'output.ipynb', 'Untitled.ipynb', '运销公司读书会会员购书与进阶细则.xlsx']
  • 输出结果为列表 list
things = os.listdir()
for thing in things:
    print('文件:',thing)
文件: .ipynb_checkpoints
文件: OS.ipynb
文件: output.ipynb
文件: Untitled.ipynb
文件: 运销公司读书会会员购书与进阶细则.xlsx
  • 判断是文件还是文件夹 os.path.isdir()
things = os.listdir()
for thing in things:
    print(thing, '是文件夹吗:',os.path.isdir(thing))
.ipynb_checkpoints 是文件夹吗: True
OS.ipynb 是文件夹吗: False
output.ipynb 是文件夹吗: False
Untitled.ipynb 是文件夹吗: False
运销公司读书会会员购书与进阶细则.xlsx 是文件夹吗: False

os.scandir() 迭代器

for file in os.scandir():
    print(file.name, file.path, file.is_dir())
.ipynb_checkpoints .\.ipynb_checkpoints True
OS.ipynb .\OS.ipynb False
output.ipynb .\output.ipynb False
Untitled.ipynb .\Untitled.ipynb False
运销公司读书会会员购书与进阶细则.xlsx .\运销公司读书会会员购书与进阶细则.xlsx False
  • name: 条目的文件名,相对于 scandir path 参数( 对应于 os.listdir的返回值)

  • path: 输入路径 NAME ( 不一定是绝对路径) --与 os.path.join(scandir_path, entry.name)

  • is_dir(*, follow_symlinks=True): 类似于 pathlib.Path.is_dir(),但返回值在 DirEntry 对象上是缓存;大多数情况下不需要系统调用;如果 follow_symlinks 是 false,则不要跟随符号链接。

  • is_file(*, follow_symlinks=True): 类似于 pathlib.Path.is_file(),但返回值在 DirEntry 对象上是缓存;大多数情况下不需要系统调用;如果 follow_symlinks 是 false,则不要跟随符号链接。

  • is_symlink(): 类似 pathlib.Path.is_symlink(),但返回值缓存在 DirEntry 对象上;大多数情况下不需要系统调用

  • stat(*, follow_symlinks=True): 类似 os.stat(),但返回值缓存在 DirEntry 对象上;不需要对 Windows (。除了符号符号外) 进行系统调用;如果 follow_symlinks 是 false,则不跟随符号链接( 像 os.lstat() )。

  • inode(): 返回项的节点数;返回值在 DirEntry 对象上缓存

# import os
# import shutil
 
# data_path='E:\\Myjupyter\\老妈工作'   
# target_path='E:\\Myjupyter\\老妈工作'
# with os.scandir(data_path) as it:
#     for entry in it:
#         if not entry.name.startswith('.') and entry.is_file():
#             file_name=entry.name
#             pair='__'.join(file_name.split('__')[:2])
#             shutil.move(data_path+file_name,target_path+pair+'\\'+file_name) 
#             print(file_name)

查询文件信息 os.scandir() --> file.stat()

for file in os.scandir():
    print(file.name,':')
    print(file.stat())
    print('size:',file.stat().st_size/1024/1024,' M')
    print('\n')
.ipynb_checkpoints :
os.stat_result(st_mode=16895, st_ino=0, st_dev=0, st_nlink=0, st_uid=0, st_gid=0, st_size=0, st_atime=1587289961, st_mtime=1587289961, st_ctime=1586514070)
size: 0.0  M


OS.ipynb :
os.stat_result(st_mode=33206, st_ino=0, st_dev=0, st_nlink=0, st_uid=0, st_gid=0, st_size=15918, st_atime=1587306515, st_mtime=1587306515, st_ctime=1587289953)
size: 0.015180587768554688  M


output.ipynb :
os.stat_result(st_mode=33206, st_ino=0, st_dev=0, st_nlink=0, st_uid=0, st_gid=0, st_size=16076, st_atime=1586707224, st_mtime=1586707224, st_ctime=1586514069)
size: 0.015331268310546875  M


test_data :
os.stat_result(st_mode=16895, st_ino=0, st_dev=0, st_nlink=0, st_uid=0, st_gid=0, st_size=0, st_atime=1587304347, st_mtime=1587304347, st_ctime=1587304268)
size: 0.0  M


Untitled.ipynb :
os.stat_result(st_mode=33206, st_ino=0, st_dev=0, st_nlink=0, st_uid=0, st_gid=0, st_size=4683, st_atime=1586707223, st_mtime=1586707223, st_ctime=1586693683)
size: 0.004466056823730469  M


运销公司读书会会员购书与进阶细则.xlsx :
os.stat_result(st_mode=33206, st_ino=0, st_dev=0, st_nlink=0, st_uid=0, st_gid=0, st_size=51807, st_atime=1586692865, st_mtime=1586692865, st_ctime=1586692865)
size: 0.049407005310058594  M
  • 创建时间
import time
# Unix 时间戳,可以用time.ctime转换

for file in os.scandir():
    print(file.name,':')
    print('创建时间',time.ctime(file.stat().st_atime))
    print('\n')
.ipynb_checkpoints :
创建时间 Sun Apr 19 17:52:41 2020


OS.ipynb :
创建时间 Sun Apr 19 22:28:35 2020


output.ipynb :
创建时间 Mon Apr 13 00:00:24 2020


test_data :
创建时间 Sun Apr 19 21:52:27 2020


Untitled.ipynb :
创建时间 Mon Apr 13 00:00:23 2020


运销公司读书会会员购书与进阶细则.xlsx :
创建时间 Sun Apr 12 20:01:05 2020
import datetime

tim = datetime.datetime.fromtimestamp(1586692865)
print(tim)
print(tim.year,tim.month,tim.day,tim.hour)
2020-04-12 20:01:05
2020 4 12 20

遍历文件夹 os.walk()

import os

for dirpath, dirname, file in os.walk('./'):
    print(f'文件相对路径:{dirpath}')
    print(f'发现文件:{file}')
    print(f'发现子文件夹:{dirname}\n')
文件相对路径:./
发现文件:['OS.ipynb', 'output.ipynb', 'Untitled.ipynb', '运销公司读书会会员购书与进阶细则.xlsx']
发现子文件夹:['.ipynb_checkpoints', 'test_data']

文件相对路径:./.ipynb_checkpoints
发现文件:['OS-checkpoint.ipynb', 'output-checkpoint.ipynb', 'Untitled-checkpoint.ipynb']
发现子文件夹:[]

文件相对路径:./test_data
发现文件:['test1.ipynb', 'test2.ipynb', 'test3.ipynb']
发现子文件夹:['.ipynb_checkpoints']

文件相对路径:./test_data\.ipynb_checkpoints
发现文件:['test1-checkpoint.ipynb', 'test2-checkpoint.ipynb', 'test3-checkpoint.ipynb']
发现子文件夹:[]
  • dirpath : 文件相对路径
  • dirname : 子文件夹列表
  • file : dirpath 下的文件列表

搜索, 匹配文件名称

str.startswith('...') 开头 str.endswith('...') 结尾

print('abc'.startswith('ab'))
print('abc'.endswith('c'))
True
True

glob.glob()

* 匹配任意字符

? 匹配单字符

[seq] 匹配 seq 中的任何字符

[!seq] 匹配不在 seq 中的任何字符

import glob

print(glob.glob('*'))
print(glob.glob('*.ipynb'))
print(glob.glob('??.ipynb'))
print(glob.glob("test[1-7].ipynb"))
print(glob.glob("test[1,3,5,7].ipynb"))
print(glob.glob("o*t.ipynb"))
['OS.ipynb', 'output.ipynb', 'test_data', 'Untitled.ipynb', '运销公司读书会会员购书与进阶细则.xlsx']
['OS.ipynb', 'output.ipynb', 'Untitled.ipynb']
['OS.ipynb']
[]
[]
['output.ipynb']

**/* 匹配任意层级文件夹中的文件 recursive = True会不断进内部文件夹

print(glob.glob('**/*.ipynb',recursive = True))
print(glob.glob('**/tes*.ipynb',recursive = True))
print(glob.glob('**/test[1-3].ipynb',recursive = True))
print(glob.glob('**/test[1,3].ipynb',recursive = True))
print(glob.glob('**/test[!1,3].ipynb',recursive = True))
['OS.ipynb', 'output.ipynb', 'Untitled.ipynb', 'test_data\\test1.ipynb', 'test_data\\test2.ipynb', 'test_data\\test3.ipynb']
['test_data\\test1.ipynb', 'test_data\\test2.ipynb', 'test_data\\test3.ipynb']
['test_data\\test1.ipynb', 'test_data\\test2.ipynb', 'test_data\\test3.ipynb']
['test_data\\test1.ipynb', 'test_data\\test3.ipynb']
['test_data\\test2.ipynb']

fnmatch

import fnmatch

print(fnmatch.fnmatch('le.py','l*.py'))
True

文件和文件夹

读取

with open(..., 'r') as ...:

with open('testfile.txt','r',encoding='utf-8') as f:
    text = f.readlines()
    print(text)
['第一行\n', '第二行\n', 'test']

写入

with open(..., 'w') as ...:

with open('testfile_w.txt','w',encoding='utf-8') as f:
    text = 'line1\nline2\n'
    f.write(text)
    f.write('line3')
with open(..., 'w') as ...:
  • 文件名不存在会直接创建, 文件已存在会被清空
with open(..., 'r') as ...:
  • 文件名不存在会直接创建, 文件已存在会继续写入

临时文件和文件夹 tempfile

from tempfile import TemporaryFile

# w+ 写入和读取
with TemporaryFile('w+') as f:
    f.write('hello world')
    f.seek(0) # 0 回到文件开头!!!!
    data = f.readlines()
    print(data)
# 程序运行完自动删除临时文件
['hello world']
from tempfile import TemporaryDirectory

# w+ 写入和读取
with TemporaryDirectory() as tmp_folder:
    print(f'temporary folder:{tmp_folder}')
# 程序运行完自动删除临时文件夹
temporary folder:C:\Users\73735\AppData\Local\Temp\tmp8zt1ddw2

创建文件夹

import os

os.mkdir('test_dir')

检测文件夹存在 os.path.exists

if not os.path.exists('test_dir'):
    os.mkdir('test_dir')

多层文件夹 os.makedirs

os.makedirs('test_dir/test_dir1/test_dir2')

复制,移动,重命名

shutil.copy 复制文件,重命名

import shutil

# copy
shutil.copy('testfile.txt','./test_dir')

# copy & rename
shutil.copy('testfile.txt','./test_dir/testfile_1.txt')
'./test_dir/testfile_1.txt'

shutil.copytree 复制文件夹

# copy dir
shutil.copytree('test_dir','copy_testdir')
'copy_testdir'

shutil.move 移动文件,文件夹

import shutil

shutil.copy('testfile.txt','testfile1.txt')
shutil.copy('testfile.txt','testfile2.txt')
shutil.copy('testfile.txt','testfile3.txt')

shutil.move('testfile1.txt','test_dir\movefile.txt')
'test_dir\\movefile.txt'
import os

print(os.listdir())
['.ipynb_checkpoints', 'copy_testdir', 'OS.ipynb', 'output.ipynb', 'testfile.txt', 'testfile2.txt', 'testfile3.txt', 'test_data', 'test_dir', 'Untitled.ipynb', '运销公司读书会会员购书与进阶细则.xlsx']

os.rename 重命名文件

import os

os.rename('testfile2.txt', 'new.txt')

删除文件

删除文件 os.remove

import os

os.remove('new.txt')

删除文件夹 shutil.rmtree()

import shutil

if not os.path.exists('del_dir'):
    os.mkdir('del_dir')

shutil.rmtree('del_dir')

Reference

[1] https://www.bilibili.com/video/BV197411f7Rp?p=4

相关文章

网友评论

      本文标题:OS Python

      本文链接:https://www.haomeiwen.com/subject/lciuihtx.html