Python基础之文件和目录操作

时间:2022-09-15 23:46:07

 

 

1 .文件操作

 

1.1 文件打开和关闭

在python, 使用 open 函数, 可以打开一个已经存在的文件, 或者创建一个新文件.

# 打开文件
f = open('test.txt', 'w')

open 函数调用完毕之后, 返回一个标识该打开文件的对象. 以后对该对象的操作, 就是对该文件的操作.

1.1.1 文件路径

  1. 如果只写了文件名, 默认会在当前目录下搜索要打开的文件. 如果找不到, 就会报错.
  2. 也可以编写完成的路径, 例如, /Users/edwardmeng/Desktop/hello.txt.

在 Windows 操作系统中注意路径编写, 如果写的是正斜杠, 用一个隔开路径. 如果写的是反斜杠, 需要两个反斜杠来隔开路径. 例如:

# 反斜杠2个
C:\\Users\\Edward Meng\\Desktop\\hello.txt
# 正斜杠1个
C:/Users/Edward Meng/Desktop/hello.txt

1.1.2 打开模式

open 函数的第二个参数, 指的是文件的打开模式

  1. 二进制模式和文本模式
  2. 读模式、写模式、追加模式、读写模式等等

文件打开都有哪些模式?

访问模式 说明
r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
w 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。
wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
r+ 打开一个文件用于读写. 文件指针将会放在文件的开头.
w+ 打开一个文件用于读写. 如果该文件已存在则将其覆盖. 如果该文件不存在,创建新文件.
a+ 打开一个文件用于读写. 如果该文件已存在, 文件指针将会放在文件的结尾. 文件打开时会是追加模式. 如果该文件不存在, 创建新文件用于读写.
rb+ 以二进制格式打开一个文件用于读写. 文件指针将会放在文件的开头.
wb+ 以二进制格式打开一个文件用于读写. 如果该文件已存在则将其覆盖. 如果该文件不存在, 创建新文件.
ab+ 以二进制格式打开一个文件用于追加. 如果该文件已存在, 文件指针将会放在文件的结尾. 如果该文件不存在, 创建新文件用于读写.

文件数据在磁盘上都是以二进制的方式存储的, 为什么打开文件又分了二进制模式和文本模式?

我们先了解一个知识, 大多数文件中的数据都是一行一行的. 那么如何区分一行是否结束? 在每一行的结束位置, 会有一个不可见的换行符. 这个换行符在不同的操作系统下, 是不一样的, 例如:

  1. 对于 Windows 操作系统, 换行符为 \r\n
  2. 对于 Mac 操作系统, 换行符为 \r
  3. 对于 Linux 操作系统, 换行符则为 \n

而在程序中, 和平台无关, 默认是 \n, 这就设计到一个问题.

例如, 我有文本信息 "我是中国人\n", 当这条信息写入文件中时, '\n' 是否需要转换成当前操作系统的换行符?

对于这个普通文本的信息, 我们希望进行转换, 所以我们就可以选择用文本模式来操作文件, 文本模式会自动将程序中的 \n 转换成对应操作系统的换行符:

  1. 如果在 Windows 上, 会转换为 \r\n
  2. 如果在 Mac 上, 会转换为 \r
  3. 如果在 Linux 上, 不会进行转换

当读取对应操作系统上的文件内容时, 会将 \r\n 或者 \r 转换为 \n.

不是所有的文件都需要进行换行符转换, 针对不需要进行换行符转换的文件, 我们就可以使用二进制模式打开文件. 数据原来是什么样, 写到文件中也是什么样, 不会进行任何转换. 磁盘中的文件是什么样, 读取到程序中保持原有的样子, 不进行任何的转换.

1.1.3 文件关闭

open 函数执行完毕之后, 会返回一个用于标识该文件的文件对象, 该对象有一个 close 方法, 调用该方法可关闭打开的文件, 释放占用的文件资源.

注意: 即使我们不关闭文件, Python 也会在某个时机下自动关闭文件, 释放文件资源. 但这并不意味着我们不需要调用 close 方法手动关闭文件, 通过 close 方法手动调用我们可以在不用时及时关闭文件, 释放文件资源. 文件使用完毕之后, 马上调用 close 方法是一个非常好的编程习惯.

1.2 文件读写

读取文件内容, 可以使用:

  1. read 方法, 默认读取全部文件数据, 设置参数, 可读取指定个数文字.
  2. readline 方法, 一次读取一行数据.
  3. readlines 方法, 一次读取所有数据, 并且返回列表, 列表中每一个元素就是一行数据.
f = open('a.txt', 'r')

# 一次读取10个数据长度
content = f.read(10)
# 一次读取一行
line = f.readline()
# 一次读取所有的行
lines = f.readlines()
print(lines, end='')

f.close()

向文件中写入内容, 可以使用 write 方法.

f = open('a.txt', 'w')
f.write('hello world!')
f.close()

1.3 文件拷贝

# 获得要拷贝的文件名
old_file_name = input('请输入一个文件名:')
# 获取文件的名字和后缀
point_position = old_file_name.rfind('.')
if point_position > 0:
    suffix = old_file_name[point_position+1:]
    # 拼接新的文件名
    new_file_name = old_file_name[:point_position] + '[附件].' + suffix
else:
    new_file_name = old_file_name + '[附件]'

# 以读的方式打开旧文件
old_file = open(old_file_name, 'rb')
# 以写的方式打开新文件
new_file = open(new_file_name, 'wb')

new_file.writelines(old_file.readlines())

# 关闭两个文件
old_file.close()
new_file.close()

1.4 总结

  1. 文件的作用是用来存储数据.
  2. 文件常见的打开模式有r、w、a、rb、wb、ab等.
  3. 文本模式会在操作系统文件和程序之间进行换行符转换, 二进制模式则不会进行换行符转换.
  4. 不同的操作系统换行符是不一样的: 4.1 Windows 的换行符为 \r\n 4.2 Mac 换行符为 \r 4.3 Linux 的换行符为 \n 4.4 程序中的换行符为 \n
  5. open 函数用于打开一个文件, 并返回一个用于标识来物理文件的对象.
  6. 文件对象的 close 方法用于关闭文件, 及时释放占用的文件资源.
  7. 文件对象的 read 方法用于从文件中读取所有数据或者读取指定个数的文字.
  8. 文件对象的 readline 方法用于从文件中读取一样数据.
  9. 文件对象的 readlines 方法用于从文件中读取所有内容, 并将将内容存储到列表中, 每一个列表元素为一行数据.
  10. 文件对象的 write 方法, 用于向文件中写入数据.

 

2 .目录操作


2.1 文件重命名

os 模块中的 rename() 可以完成对文件的重命名操作.

import os

os.rename('11[附件].html', 'index.html')

2.2 文件删除

import os

os.remove('index.html')

2.3 创建和删除目录

import os

# 创建目录
os.mkdir('abc')
# 删除目录
os.rmdir('abc')

2.4 获取和修改当前工作目录

import os

# 获得当前工作目录
cwd = os.getcwd()
print(cwd)
# 改变当前工作目录
os.chdir('/Users/edwardmeng/Desktop')
# 创建文件
os.mkdir('abc')

2.5 获得指定目录下的文件列表

import os


file_list = os.listdir()
print(file_list)

file_list = os.listdir('/Users/edwardmeng/Desktop')
print(file_list)

2.6 练习: 批量修改文件名

import os


# 1. 批量产生一些文件
def create_files():
    """创建测试文件"""

    # 1.1 创建目录
    os.mkdir('files')
    # 1.2 将工作目录切换到 files 目录中
    os.chdir('./files')
    # 1.3 在 files 目录中创建 20 个文件名为 文件1、文件2...
    i = 0
    while i < 20:
        file = open('file' + str(i), 'w')
        file.write('远看天上一火链, 原是玉皇要抽烟, 如果玉皇不抽烟, 为何又是一火链!')
        file.close()
        i += 1


# 2. 批量将文件名修改为 [itcast.cn]-file1.txt
def change_file_names():

    # 获取文件列表
    files_list = os.listdir()
    # 遍历文件名
    for name in files_list:
        os.rename(name, '[itcast]' + name)


create_files()
change_file_names()

2.7 总结

  1. os.rename 方法可修改一个文件的名字.
  2. os.remove 方法可删除一个存在的文件.
  3. os.mkdir 方法可创建一个目录.
  4. os.rmdir 方法可删除一个目录.
  5. os.getcwd 方法可获得当前工作目录.
  6. os.chdir 方法可修改当前的工作目录.
  7. os.listdir 方法获得指定目录下的文件列表.