文件处理系列

import os

权限检验

import os, sys

# 假定 /tmp/foo.txt 文件存在,并有读写权限

ret = os.access("D://my content//liyan//Desktop//New folder//foo.txt", os.F_OK)
print ("F_OK - 返回值 %s"% ret )
# 是否path存在
ret = os.access("D://my content//liyan//Desktop//New folder//foo.txt", os.R_OK)
print ("R_OK - 返回值 %s"% ret)
# path可读
ret = os.access("D://my content//liyan//Desktop//New folder//foo.txt", os.W_OK)
print ("W_OK - 返回值 %s"% ret)
# path可写
ret = os.access("D://my content//liyan//Desktop//New folder//foo.txt", os.X_OK)
print ("X_OK - 返回值 %s"% ret)
# path可执行
F_OK - 返回值 True
R_OK - 返回值 True
W_OK - 返回值 True
X_OK - 返回值 True

改变目录路径

import os, sys

path = "/tmp"

# 查看当前工作目录
retval = os.getcwd()
print ("当前工作目录为 %s" % retval)

# 修改当前工作目录
os.chdir( path )

# 查看修改后的工作目录
retval = os.getcwd()

print ("目录修改成功 %s" % retval)
当前工作目录为 C:\Users\liyan
目录修改成功 C:\tmp

设置路径的标记为数字标记,多个标记可以使用OR来组合只支持UNIX

# os.chflags(path, flags)
# import os,stat

# path = "/tmp/foo.txt"

# # 为文件设置标记,使得它不能被重命名和删除
# flags = stat.SF_NOUNLINK
# retval = os.chflags( path, flags)
# print "返回值: %s" % retval

更改目录或文件权限

import os, sys, stat

# 假定 /tmp/foo.txt 文件存在,设置文件可以通过用户组执行

os.chmod("D://my content//liyan//Desktop//New folder//foo.txt", stat.S_IXGRP)

# 设置文件可以被其他用户写入
os.chmod("D://my content//liyan//Desktop//New folder//foo.txt", stat.S_IRWXO)

print ("修改成功!!")
# path -- 文件名路径或目录路径。

# flags -- 可用以下选项按位或操作生成, 目录的读权限表示可以获取目录里文件名列表, ,执行权限表示可以把工作目录切换到此目录 ,删除添加目录里的文件必须同时有写和执行权限 ,文件权限以用户id->组id->其它顺序检验,最先匹配的允许或禁止权限被应用。

# stat.S_IXOTH: 其他用户有执行权0o001
# stat.S_IWOTH: 其他用户有写权限0o002
# stat.S_IROTH: 其他用户有读权限0o004
# stat.S_IRWXO: 其他用户有全部权限(权限掩码)0o007
# stat.S_IXGRP: 组用户有执行权限0o010
# stat.S_IWGRP: 组用户有写权限0o020
# stat.S_IRGRP: 组用户有读权限0o040
# stat.S_IRWXG: 组用户有全部权限(权限掩码)0o070
# stat.S_IXUSR: 拥有者具有执行权限0o100
# stat.S_IWUSR: 拥有者具有写权限0o200
# stat.S_IRUSR: 拥有者具有读权限0o400
# stat.S_IRWXU: 拥有者有全部权限(权限掩码)0o700
# stat.S_ISVTX: 目录里文件目录只有拥有者才可删除更改0o1000
# stat.S_ISGID: 执行此文件其进程有效组为文件所在组0o2000
# stat.S_ISUID: 执行此文件其进程有效用户为文件所有者0o4000
# stat.S_IREAD: windows下设为只读
# stat.S_IWRITE: windows下取消只读
修改成功!!

更改文件的所有者,不修改设置为-1,需要root权限 只限制Unix

#os.chown(path, uid, gid);
#os.chown("/tmp/foo.txt", 100, -1)

更改当前进程的跟目录为指定目录,需管理员权限

# import os, sys

# # 设置根目录为 /tmp

# os.chroot("/tmp")

# print "修改根目录成功!!"

打开关闭文件

import os, sys

# 打开文件
fd = os.open( "D://my content//liyan//Desktop//New folder//foo1.txt", os.O_RDWR|os.O_CREAT )

#  写入字符串
os.write(fd, "This is test")

# 关闭文件
os.close( fd )

print ("关闭文件成功!!")
---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

<ipython-input-28-d1a387feca4b> in <module>
      5 
      6 #  写入字符串
----> 7 os.write(fd, "This is test")
      8 
      9 # 关闭文件


TypeError: a bytes-like object is required, not 'str'
import os, sys

# 打开文件
fd = os.open( "D://my content//liyan//Desktop//New folder//foo1.txt", os.O_RDWR|os.O_CREAT )

# 写入字符串
os.write(fd, "This is test")

# 关闭文件
os.closerange( fd, fd)

print ("关闭文件成功!!")
---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

<ipython-input-30-9ad695da6c45> in <module>
      5 
      6 # 写入字符串
----> 7 os.write(fd, "This is test")
      8 
      9 # 关闭文件


TypeError: a bytes-like object is required, not 'str'
# import os, sys

# # 打开文件
# fd = os.open( "foo.txt", os.O_RDWR|os.O_CREAT )

# # 复制文件描述符
# d_fd = os.dup( fd )

# # 使用复制的文件描述符写入文件
# os.write(d_fd, "This is test")

# # 关闭文件
# os.closerange( fd, d_fd)

# print "关闭所有文件成功!!"
# import os, sys

# # 打开文件
# fd = os.open( "foo.txt", os.O_RDWR|os.O_CREAT )

# # 写入字符串
# os.write(fd, "This is test")

# # 文件描述符为 1000
# fd2 = 1000
# os.dup2(fd, fd2);

# # 在新的文件描述符上插入数据
# os.lseek(fd2, 0, 0)
# str = os.read(fd2, 100)
# print "读取的字符串是 : ", str

# # 关闭文件
# os.close( fd )

# print "关闭文件成功!!"

返回指定列表

import os, sys

# 打开文件
path = "D://my content//liyan//Desktop//New folder//"
dirs = os.listdir( path )

# 输出所有文件和文件夹
for file in dirs:
    print(file)
112
113
foo.txt
foo1.txt

os.getcwd()

返回当前工作目录

import os, sys

# 创建的目录
path = "D://my content//liyan//Desktop//New folder//daily"

os.makedirs( path, 0o755 );

print ("路径被创建")
路径被创建

删除

# import os, sys

# # 列出目录
# print ("目录为: %s" %os.listdir(os.getcwd()))

# # 移除
# os.remove("D://my content//liyan//Desktop//New folder//foo.txt")

# # 移除后列出目录
# print ("移除后 : %s" %os.listdir(os.getcwd()))
	
# os.removedirs(path)
	
# os.renames(old, new)
	
# os.rmdir(path)

python批量提取子文件夹下指定名称的文件

import os
import re
import xlwt

# 递归复制文件夹内的文件
# def copyFiles(sourceDir, targetDir):
#     for file in os.listdir(sourceDir):
#         sourceDir1 = os.path.join(sourceDir, file)  # 路径名拼接
#         targetDir1 = os.path.join(targetDir)
#         for file in os.listdir(sourceDir1):
#             sourceDir2 = os.path.join(sourceDir1, file)
#             # 忽略某些特定的子文件夹
#             if sourceDir2.find("113") > 0:
#                 # 列出源目录文件和文件夹
#                 for file in os.listdir(sourceDir2):
#                     # 拼接完整路径
#                     if re.search('Gazeraw.csv', file):
#                         sourceFile = os.path.join(sourceDir2, file)
#                         targetFile = os.path.join(targetDir1, file)

#                         if os.path.isfile(sourceFile):
#                             if not os.path.exists(targetDir1):
#                                 os.makedirs(targetDir1)
#                             if not os.path.exists(targetFile) or (os.path.exists(targetFile) and (
#                                     os.path.getsize(targetFile) != os.path.getsize(sourceFile))):
#                                 open(targetFile, "wb").write(open(sourceFile, "rb").read())
# copyFiles("D:\\my content\\liyan\\Desktop\\New folder","D:\\my content\\liyan\\Desktop\\New folder\\112")

shutil

  1. shutil.copyfileobj(fsrc, fdst[, length=16*1024]) copy文件内容到另一个文件,可以copy指定大小的内容。这个方法是shutil模块中其它拷贝方法的基础,其它方法在本质上都是调用这个方法。
import shutil
s=open('D:\\my content\\liyan\\Desktop\\New folder\\foo1.txt','r')
d=open('D:\\my content\\liyan\\Desktop\\New folder\\foo12.txt','w')
shutil.copyfileobj(s,d,length=16*1024)
  1. shutil.copyfile(src, dst) 拷贝整个文件。同样看下它的源码,忽略前面一些检测用的代码,该方法的核心在最后几行,我们可以很清楚地看到copyfile()方法对copyfileobj()进行了调用。
  2. shutil.copymode(src, dst) 仅拷贝权限。内容、组、用户均不变。
  3. shutil.copystat(src, dst) 仅复制所有的状态信息,包括权限,组,用户,时间等。
  4. shutil.copy(src,dst) 同时复制文件的内容以及权限,也就是先copyfile()然后copymode()。
  5. shutil.copy2(src, dst) 同时复制文件的内容以及文件的所有状态信息。先copyfile()后copystat()。
  6. shutil.ignore_patterns(*patterns) 忽略指定的文件。通常配合下面的copytree()方法使用。
  7. shutil.copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2,ignore_dangling_symlinks=False) 递归地复制目录及其子目录的文件和状态信息 symlinks:指定是否复制软链接。小心陷入死循环。 ignore:指定不参与复制的文件,其值应该是一个ignore_patterns()方法。 copy_function:指定复制的模式
  8. shutil.rmtree(path[, ignore_errors[, onerror]]) 递归地删除目录及子目录内的文件。注意!该方法不会询问yes或no,被删除的文件也不会出现在回收站里,请务必小心!
  9. shutil.move(src, dst) 递归地移动文件,类似mv命令,其实就是重命名。
  10. shutil.which(cmd) 类似linux的which命令,返回执行该命令的程序路径。Python3.3新增
  11. shutil.make_archive(base_name, format[, root_dir[, base_dir[, verbose[, dry_run[, owner[, group[, logger]]]]]]])

创建归档或压缩文件。

base_name:压缩后的文件名。如果不指定绝对路径,则压缩文件保存在当前目录下。这个参数必须指定。 format:压缩格式,可以是“zip”, “tar”, “bztar” ,“gztar”,“xztar”中的一种。这个参数也必须指定。 root_dir:设置压缩包里的根目录,一般使用默认值,不特别指定。 base_dir:要进行压缩的源文件或目录。 owner:用户,默认当前用户。 group:组,默认当前组。 logger:用于记录日志,通常是logging.Logger对象。

  1. shutil.unpack_archive(filename[, extract_dir[, format]])

解压缩或解包源文件。

filename是压缩文档的完整路径 extract_dir是解压缩路径,默认为当前目录。 format是压缩格式。默认使用文件后缀名代码的压缩格式。

import os,shutil
from shutil import copytree, ignore_patterns
path1=r'D:\\my content\\liyan\\Desktop\\New folder'
path2=r'D:\\my content\\liyan\\Desktop\\New folder\\114'
shutil.copytree(path1,path2,ignore=ignore_patterns('*Gazeraw.csv'))
'D:\\\\my content\\\\liyan\\\\Desktop\\\\New folder\\\\114'
import os
import re
import xlwt

#递归复制文件夹内的文件
def copyFiles(sourceDir, targetDir):
    for file in os.scandir(sourceDir):
        sourceDir1 = os.path.join(sourceDir, file)  # 路径名拼接
        targetDir1 = os.path.join(targetDir)
#         for file in os.listdir(sourceDir1):
#             sourceDir2 = os.path.join(sourceDir1, file)
#             忽略某些特定的子文件夹
        if file.is_dir():
            if sourceDir1.find("114") > 0:
    #         列出源目录文件和文件夹
                for file in os.scandir(sourceDir1):
                    if file.is_dir():
                        sourceDir2 = os.path.join(sourceDir1, file)
                        if sourceDir2.find("11") > 0:
                            for file in os.listdir(sourceDir2):
                        # 拼接完整路径
                                if re.search('GazeFix.csv', file):
                                    sourceFile = os.path.join(sourceDir2, file)
                                    targetFile = os.path.join(targetDir1, file)

                                    if os.path.isfile(sourceFile):
                                        if not os.path.exists(targetDir1):
                                            os.makedirs(targetDir1)
                                        if not os.path.exists(targetFile) or (os.path.exists(targetFile) and (
                                                os.path.getsize(targetFile) != os.path.getsize(sourceFile))):
                                            open(targetFile, "wb").write(open(sourceFile, "rb").read())
copyFiles("D:\\my content\\liyan\\Desktop\\New folder\\114","D:\\my content\\liyan\\Desktop\\New folder\\diary")
D:\my content\liyan\Desktop\New folder\114\111\111
D:\my content\liyan\Desktop\New folder\114\111\111
D:\my content\liyan\Desktop\New folder\114\111\111
D:\my content\liyan\Desktop\New folder\114\111\111
D:\my content\liyan\Desktop\New folder\114\111\111
D:\my content\liyan\Desktop\New folder\114\111\111
D:\my content\liyan\Desktop\New folder\114\111\111
D:\my content\liyan\Desktop\New folder\114\111\111
D:\my content\liyan\Desktop\New folder\114\111\111
D:\my content\liyan\Desktop\New folder\114\111\111
D:\my content\liyan\Desktop\New folder\114\111\111
D:\my content\liyan\Desktop\New folder\114\111\111
D:\my content\liyan\Desktop\New folder\114\111\111
D:\my content\liyan\Desktop\New folder\114\111\111
D:\my content\liyan\Desktop\New folder\114\111\111
D:\my content\liyan\Desktop\New folder\114\111\111
D:\my content\liyan\Desktop\New folder\114\111\111
D:\my content\liyan\Desktop\New folder\114\111\111
D:\my content\liyan\Desktop\New folder\114\111\111
D:\my content\liyan\Desktop\New folder\114\111\111
D:\my content\liyan\Desktop\New folder\114\111\111
D:\my content\liyan\Desktop\New folder\114\112\111
D:\my content\liyan\Desktop\New folder\114\112\111
D:\my content\liyan\Desktop\New folder\114\112\111
D:\my content\liyan\Desktop\New folder\114\112\111
D:\my content\liyan\Desktop\New folder\114\112\111
D:\my content\liyan\Desktop\New folder\114\112\111
D:\my content\liyan\Desktop\New folder\114\112\111
D:\my content\liyan\Desktop\New folder\114\112\111
D:\my content\liyan\Desktop\New folder\114\112\111
D:\my content\liyan\Desktop\New folder\114\112\111
D:\my content\liyan\Desktop\New folder\114\112\111
D:\my content\liyan\Desktop\New folder\114\112\111
D:\my content\liyan\Desktop\New folder\114\112\111
D:\my content\liyan\Desktop\New folder\114\112\111
D:\my content\liyan\Desktop\New folder\114\112\111
D:\my content\liyan\Desktop\New folder\114\112\111
D:\my content\liyan\Desktop\New folder\114\112\111
D:\my content\liyan\Desktop\New folder\114\112\111
D:\my content\liyan\Desktop\New folder\114\112\111
D:\my content\liyan\Desktop\New folder\114\112\111
D:\my content\liyan\Desktop\New folder\114\112\111
D:\my content\liyan\Desktop\New folder\114\113\111
D:\my content\liyan\Desktop\New folder\114\113\111
D:\my content\liyan\Desktop\New folder\114\113\111
D:\my content\liyan\Desktop\New folder\114\113\111
D:\my content\liyan\Desktop\New folder\114\113\111
D:\my content\liyan\Desktop\New folder\114\113\111
D:\my content\liyan\Desktop\New folder\114\113\111
D:\my content\liyan\Desktop\New folder\114\113\111
D:\my content\liyan\Desktop\New folder\114\113\111
D:\my content\liyan\Desktop\New folder\114\113\111
D:\my content\liyan\Desktop\New folder\114\113\111
D:\my content\liyan\Desktop\New folder\114\113\111
D:\my content\liyan\Desktop\New folder\114\113\111
D:\my content\liyan\Desktop\New folder\114\113\111
D:\my content\liyan\Desktop\New folder\114\113\111
D:\my content\liyan\Desktop\New folder\114\113\111
D:\my content\liyan\Desktop\New folder\114\113\111
D:\my content\liyan\Desktop\New folder\114\113\111
D:\my content\liyan\Desktop\New folder\114\113\111
D:\my content\liyan\Desktop\New folder\114\113\111
D:\my content\liyan\Desktop\New folder\114\113\111