您现在的位置是:首页 > 正文

python 文件、文件夹详细操作

2024-02-01 05:21:09阅读 9

一、文件操作

1、文件操作流程

2、文件打开模式

3、文件循环

4、文件的修改

5、flush方法

6、whit语句

7、其它操作

二、文件夹 /

1、提要

2、判断路径或文件

3、路径名、文件名分割

4、工作目录及创建文件夹操作

5、删除文件夹、文件

6、重命名文件夹/文件

7、复制移动文件夹/文件

不要努力成为一个成功者,要努力成为一个有价值的人。


一、文件操作

1、文件操作流程

1.打开文件,得到文件句柄并赋值给一个变量

2.通过文件句柄对文件进行操作

3.关闭文件

2、文件打开模式

f = open("file_test","r",encoding = "utf-8")    #打开文件,“读模式”,只能读,得到文件句柄并赋值给一个变量
print(f.read())                     #读文件所有内容,读完之后文件光标跳到最后,文件大时慎用
f.close()

f1 = open("file_test","w",encoding="utf-8")     #写模式,会新建一个file_test文件,再往里写入
f1.write("-------------")
f1.close()

f2 = open("file_test","a",encoding="utf-8")     #追加模式,在原文件内容最后追加,无原文件则新建
f2.write("-------------")
f2.close()

f3  = open("file_test","r+",encoding="utf-8")    #读写模式,写在原文件内容最后追加,无原文件则新建
print(f3.readline())                  #按行读
print(f3.readline())
print(f3.readline())                  #打印前三行,这个时候光标移动到第三行位置
print(f3.tell())                    #打印光标位置
f3.write("--------------")               #但是写入还是文件内容最后写入
f3.close()

f4  = open("file_test","w+",encoding="utf-8")    #写读模式,,只要是“写在前”都会建一个新文件,在写入
f4.write("----------------------\n")
f4.write("----------------------\n")
f4.write("----------------------\n")
f4.seek(10)                       #光标移动到10的位置
f4.write("test4")                    #再写入会将原内容覆盖
f4.seek(0)                        #将光标移动到开头的位置
print(f4.read())
f4.close()
#输出
#----------ni hao -----
#----------------------
#----------------------

f5  = open("file_test","a+",encoding="utf-8")    #追加读模式,在原文件内容最后追加,无原文件新建
f5.write("----------------------\n")
f5.write("----------------------\n")
f5.write("----------------------\n")
f5.seek(10)                       #光标移动到10的位置
f5.write("test5")                    #再写入会在文件内容最后写入
f5.seek(0)
print(f5.read())
f5.close()

f6  = open("file_test","rb")                 #以二进制文件格式读这个文件
print(f6.readline())
print(f6.readline())
print(f6.readline())
f6.close()

f7  = open("file_test","ab")                 #以二进制文件格式追加这个文件
f7.write("-------------------\n".encode())       #encode 将str字符转换为bytes
f7.write("-------------------\n".encode())
f7.write("-------------------\n".encode())
f7.close()

f8  = open("file_test","wb")                 #以二进制文件格式写这个文件
f8.write("-------------------\n".encode())       #encode 将str字符转换为bytes
f8.write("-------------------\n".encode())
f8.write("-------------------\n".encode())
f8.close()


#注:还有rU或r+U模式,"U"表示在读取时,可以将 \r \n \r\n自动转换成 \n (与 r 或 r+ 模式同使用)

3、文件循环

#按行循环,并且将第五行替换
f = open("file_test","r",encoding="utf-8")
count = 0
for line in f:
    count += 1
    if count == 5:
        print("----分割线----")
        continue
    print(line.strip())                           #strip是去除行首行尾的空格符和换行符
f.close()

#f.readlines()                                    #切记用f.readlines是先将文件转换为列表,如果文件太大时对内存消耗太大

4、文件的修改

#打开一个文件,修改完了写到一个新文件
f = open("file_test","r",encoding="utf-8")
f_new = open("file_new","w",encoding="utf-8")
for line in f:                               #按行取出,每行都是一串字符串
    if "fengxiaoli" in line:
        line = line.replace("fengxiaoli","FENGXIAOLI")       #对字符串进行操作,J
    f_new.write(line)
f.close()
f_new.close()

5、flush方法

f = open("file_test","w",encoding="utf-8")
f.write("hello\n")
f.write("hello\n")
f.write("hello\n")
f.flush()       #当往文件写内容的时候,会有一个缓存,达到一个时间,一次往文件写入。如果这时候断电可能内容并没有写入成功,flush刷新会立即执行

6、whit语句

#with语句作用,为了避免打开文件后忘记关闭

with open("file_test","r",encoding="utf-8") as f:          #类似于f = open("file_test","r",encoding="utf-8")

with open("file_test","r",encoding="utf-8") as f, \        #还可以同时打开多个文件
        open("file_test2","r",encoding="utf-8") as f2:

7、其它操作

f = open("file_test","r",encoding="utf-8")
print(f.tell())              #打印光标位置,按字符计数
print(f.readline())          #按行读
print(f.read(10))            #按字符读
print(f.tell())
f.seek(0)                   #把光标回到开头
f.seek(12)                  #把光标移动到12个字符的位置
print(f.readline())
print(f.encoding)           #打印文件编码

print(f.isatty())           #判断文件是否是终端设备,返回Ture or false
print(f.seekable())         #判断是否能移动文件光标,返回Ture or false
print(f.readable())         #判断文件是否可读
print(f.writable())         #判断文件是否可写


# f  = open("file_test","a",encoding="utf-8")
# f.truncate(12)      #从头开始截取多少字符

二、文件夹 /

           文件

1、提要

我们经常会与文件和目录打交道,对于这些操作,python可以使用 os 及 shutill 模块,其中包含了很多操作文件和目录的函数。

os 可以执行简单的文件夹及文件操作,引入用  import os,可用  help(os)  或是  dir(os)  查看其用法。注意有些函数在os模块中,有的是在os.path模块中。

shutil 模块提供了大量的文件的高级操作,特别针对文件拷贝和删除。主要功能为目录和文件操作以及压缩操作。须引入 import shutil  ,具体 help。本文仅介绍移动、复制及删除。

可先在 D:\ 下创建文件夹 Python_os , 再在其下创建文件夹 os, 再在其下创建 test.txt;之后的示例会在该文件夹下操作

2、判断路径或文件

       os.path.isabs(...)      # 判断是否绝对路径

    os.path.exists(...)     # 判断是否真实存在

    os.path.isdir(...)       # 判断是否是个目录

    os.path.isfile(...)       # 判断是否是个文件

注意:   把两个路径合成一个时,不要直接拼字符串,而要通过 os.path.join(part1,part2) 函数,这样可以正确处理不同操作系统的路径分隔符。在Linux/Unix/Mac下,os.path.join()返回这样的字符串:    part1/part2,而Windows下会返回这样的字符串:  part1\part2

import os
import shutil

file_dir = "D:\\Python_os\\os"                          # 注意 \\ ;windows 下是这么表示的;Linux 和 Mac 是 /
file_name = "test.txt"
file_abs = os.path.join(file_dir, file_name)            # os.path.join(...) 表示路径链接


'''判断路径或文件'''
print (1,os.path.isabs(file_dir))        1. True               # 判断是否绝对路径
print (2,os.path.isabs(file_name))       2. False                 
print (3,os.path.isabs(file_abs))        3. True                
print (4,os.path.exists(file_abs))       4. True              # 判断是否真实存在
print (5,os.path.exists(os.path.join(file_dir,"xxx")))           5. False     
print (6,os.path.isdir(file_dir))        6. True               # 判断是否是个目录
print (7,os.path.isdir(file_abs))        7. False
print (8,os.path.isfile(file_dir))       8. False               # 判断是否是个文件
print (9,os.path.isfile(file_abs))       9. True

3、路径名、文件名分割

    os.path.split(...)            # 分隔目录和文件名/文件夹名         

    os.path.splitdrive(...)        # 分隔盘符(windows系统)     

    os.path.splitext(...)           # 分隔文件和扩展名

这些合并、拆分路径的函数并不要求目录和文件要真实存在,它们只对字符串进行操作。

4、工作目录及创建文件夹操作

    os.getcwd()       # 获取当前工作目录

    os.chdir(...)       # 改变工作目录

    os.listdir(...)      # 列出目录下的文件

    os.mkdir(...)      # 创建单个目录        注意:创建多级用 os.makedirs()

    os.makedirs(...)    # 创建多级目录
import os

file_dir = "D:\\Python_os\\os"    

print (os.getcwd())                                # 获取当前工作目录
os.chdir(file_dir)                                 # 改变工作目录
print (os.getcwd())    
print (os.listdir(file_dir))                       # 列出当前工作目录的所有文件 Python2 不支持 os.listdir()    Python3 会列出当前工作目录下的所有文件      
os.mkdir("test_mkdir")                             # 在当前工作目录下创建文件夹 test_mkdir;注意不可存在相同文件夹,不然会报错
os.makedirs("test_mkdir\\test1")
os.chdir(".\\test_mkdir")                          # . 表示本级目录; .. 表示上级目录
print (os.getcwd())    
for i in range(2,6):                               # 使用for循环等,可方便的创建多个文件夹
    dir_name = "test" + str(i)
    os.mkdir(dir_name)

在执行了上述实例代码后,os 文件夹中新建了空的 test_mkdir 文件夹,而 test_dir 文件夹下也新建出了 test1 至 test5 的空文件夹

创建文件夹可能会出错,原因具体有:(1) path 已存在时(不管是文件还是文件夹)  (2) 驱动器不存在  (3) 磁盘已满  (4) 磁盘是只读的或没有写权限

5、删除文件夹、文件

    os.rmdir(...)            # 删除空文件夹  注意:必须为空文件夹  如需删除文件夹及其下 
                                                          所有文件,需用 shutil

    os.remove(...)                   # 删除单一文件

    shutil.rmtree(...)               # 删除文件夹及其下所有文件

在上方示例的文件夹基础上,操作删除 test1 文件夹 (空文件夹可用 os.rmdir() ),删除 test_mkdir 及其下所有文件();示例代码如下

import os
import shutil

file_dir = "D:\\Python_os\\os"                    

''' 删除文件/文件夹 '''
os.chdir(file_dir+"\\test_mkdir")                    
print(os.getcwd())                                    # 确保当前工作目录
print(os.listdir(os.getcwd()))                        # 查看当前文件夹下所有文件    
os.rmdir("test1")                                     # 删除 test1 文件夹(空文件夹)
print(os.listdir(os.getcwd()))    
os.chdir("..\\")
print(os.getcwd())                                    # 切换到上级目录
print(os.listdir(os.getcwd()))
shutil.rmtree("test_mkdir")                           # 删除 test_mkdir 及其下所有文件

可见运行结果如下;产生异常的可能原因:  (1) 路径不存在 (2) 路径子目录中有文件或下级子目录(os.rmdir) (3) 没有操作权限或只读

只是删除单一文件,则用   os.remove("test.txt")   即可;产生异常的可能原因:  (1) 文件不存在   (2) 对该文件没有操作权限或只读。

6、重命名文件夹/文件

可对某一文件或文件夹重命名   os.rename(oldfileName, newFilename)  

在os文件夹中新建文件夹 test,文件 test.txt

''' 重命名文件夹/文件 '''
os.chdir(file_dir)
print(os.listdir(os.getcwd()))
os.rename("test","test1")    
os.rename("test.txt","test1.txt")                # 重命名,注意需要带扩展名
print(os.listdir(os.getcwd()))

可见运行结果如下;产生异常的可能原因:  (1) oldfilename 旧文件名不存在(文件须带扩展名)   (2)newFilename 新文件已经存在

注意:新文件的扩展名不能遗漏,理论上需要保持类型一致;但这也不失为改文件类型的一种方式(相当于直接改文件的扩展名)

7、复制移动文件夹/文件

须使用 shutil 模块,引入 import shutil 

    shutil.copyfile("old","new")       # 复制文件,都只能是文件

    shutil.copytree("old","new")     # 复制文件夹,都只能是目录,且new必须不存在

    shutil.copy("old","new")           # 复制文件/文件夹,复制 old 为 new(new是文件, 
                                                若不存在,即新建),复制 old 为至 new 文件夹 
                                               (文件夹已存在)

    shutil.move("old","new")          # 移动文件/文件夹至 new 文件夹中

我们现在 D:\ 下创建新文件夹 Python_shutil ,然后工作目录切到该目录,直接使用 Python 来操作吧,参考代码如下:

import os
import shutil

os.chdir("D:\\")
os.mkdir("Python_shutil")
file_dir = "D:\\Python_shutil"
os.chdir(file_dir)

为演示复制、移动操作,我们在该文件夹下手动操作 新建文件夹 test_org、 test_copy 及 test_move; 新建文件 test.txt  test1.txt , 两者内容不同

Python 复制、移动的操作示例代码如下:

import os
import shutil

file_dir = "D:\\Python_shutil"
os.chdir(file_dir)
shutil.copyfile("test_org.txt","test_copy.txt")        # copy test_org.txt 为 test_copy.txt 若存在,则覆盖
shutil.copyfile("test_org.txt","test1.txt")            # 存在,覆盖
shutil.copytree("test_org","test_copytree")            # copy test_org 为 test_copytree(不存在的新目录)
shutil.copy("test_org.txt","test_copy1.txt")           # 同 copyfile
shutil.copy("test_org.txt","test_copy")                # 将文件 copy 至 目标文件夹中(须存在)
shutil.copy("test_org.txt","test_xxx")                 # 将文件 copy 至 目标文件(该文件可不存在,注意类型!)
print os.listdir(os.getcwd())
shutil.move("test_org.txt","test_move")                # 将文件 move 至 目标文件夹中
shutil.move("test_org","test_move")                    # 将文件夹 move 至 目标文件夹中
print os.listdir(os.getcwd())

网站文章