1 .文件操作
1.1 文件打开和关闭
在python, 使用 open 函数, 可以打开一个已经存在的文件, 或者创建一个新文件.
# 打开文件
f = open('test.txt', 'w')
open 函数调用完毕之后, 返回一个标识该打开文件的对象. 以后对该对象的操作, 就是对该文件的操作.
1.1.1 文件路径
- 如果只写了文件名, 默认会在当前目录下搜索要打开的文件. 如果找不到, 就会报错.
- 也可以编写完成的路径, 例如, /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 函数的第二个参数, 指的是文件的打开模式
- 二进制模式和文本模式
- 读模式、写模式、追加模式、读写模式等等
文件打开都有哪些模式?
访问模式 | 说明 |
---|---|
r | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
w | 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
rb | 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。 |
wb | 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
ab | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
r+ | 打开一个文件用于读写. 文件指针将会放在文件的开头. |
w+ | 打开一个文件用于读写. 如果该文件已存在则将其覆盖. 如果该文件不存在,创建新文件. |
a+ | 打开一个文件用于读写. 如果该文件已存在, 文件指针将会放在文件的结尾. 文件打开时会是追加模式. 如果该文件不存在, 创建新文件用于读写. |
rb+ | 以二进制格式打开一个文件用于读写. 文件指针将会放在文件的开头. |
wb+ | 以二进制格式打开一个文件用于读写. 如果该文件已存在则将其覆盖. 如果该文件不存在, 创建新文件. |
ab+ | 以二进制格式打开一个文件用于追加. 如果该文件已存在, 文件指针将会放在文件的结尾. 如果该文件不存在, 创建新文件用于读写. |
文件数据在磁盘上都是以二进制的方式存储的, 为什么打开文件又分了二进制模式和文本模式?
我们先了解一个知识, 大多数文件中的数据都是一行一行的. 那么如何区分一行是否结束? 在每一行的结束位置, 会有一个不可见的换行符. 这个换行符在不同的操作系统下, 是不一样的, 例如:
- 对于 Windows 操作系统, 换行符为
- 对于 Mac 操作系统, 换行符为
- 对于 Linux 操作系统, 换行符则为
而在程序中, 和平台无关, 默认是 , 这就设计到一个问题.
例如, 我有文本信息 "我是中国人 ", 当这条信息写入文件中时, ' ' 是否需要转换成当前操作系统的换行符?
对于这个普通文本的信息, 我们希望进行转换, 所以我们就可以选择用文本模式来操作文件, 文本模式会自动将程序中的 转换成对应操作系统的换行符:
- 如果在 Windows 上, 会转换为
- 如果在 Mac 上, 会转换为
- 如果在 Linux 上, 不会进行转换
当读取对应操作系统上的文件内容时, 会将 或者 转换为 .
不是所有的文件都需要进行换行符转换, 针对不需要进行换行符转换的文件, 我们就可以使用二进制模式打开文件. 数据原来是什么样, 写到文件中也是什么样, 不会进行任何转换. 磁盘中的文件是什么样, 读取到程序中保持原有的样子, 不进行任何的转换.
1.1.3 文件关闭
open 函数执行完毕之后, 会返回一个用于标识该文件的文件对象, 该对象有一个 close 方法, 调用该方法可关闭打开的文件, 释放占用的文件资源.
注意: 即使我们不关闭文件, Python 也会在某个时机下自动关闭文件, 释放文件资源. 但这并不意味着我们不需要调用 close 方法手动关闭文件, 通过 close 方法手动调用我们可以在不用时及时关闭文件, 释放文件资源. 文件使用完毕之后, 马上调用 close 方法是一个非常好的编程习惯.
1.2 文件读写
读取文件内容, 可以使用:
- read 方法, 默认读取全部文件数据, 设置参数, 可读取指定个数文字.
- readline 方法, 一次读取一行数据.
- 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 总结
- 文件的作用是用来存储数据.
- 文件常见的打开模式有r、w、a、rb、wb、ab等.
- 文本模式会在操作系统文件和程序之间进行换行符转换, 二进制模式则不会进行换行符转换.
- 不同的操作系统换行符是不一样的: 4.1 Windows 的换行符为 4.2 Mac 换行符为 4.3 Linux 的换行符为 4.4 程序中的换行符为
- open 函数用于打开一个文件, 并返回一个用于标识来物理文件的对象.
- 文件对象的 close 方法用于关闭文件, 及时释放占用的文件资源.
- 文件对象的 read 方法用于从文件中读取所有数据或者读取指定个数的文字.
- 文件对象的 readline 方法用于从文件中读取一样数据.
- 文件对象的 readlines 方法用于从文件中读取所有内容, 并将将内容存储到列表中, 每一个列表元素为一行数据.
- 文件对象的 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 总结
- os.rename 方法可修改一个文件的名字.
- os.remove 方法可删除一个存在的文件.
- os.mkdir 方法可创建一个目录.
- os.rmdir 方法可删除一个目录.
- os.getcwd 方法可获得当前工作目录.
- os.chdir 方法可修改当前的工作目录.
- os.listdir 方法获得指定目录下的文件列表.