一、文件的类型:
1.文件时数据的抽象和集合
- 文件是存储在辅助存储器上的数据序列
- 文件时数据存储的一种形式
- 文件时数据存储的一种形式
2.文本文件和二进制文件
- 文本文件和二进制文件值是文件的展示方式
- 本质上,所有文件都是二进制形式存储
- 形式上,所有文件采用两种方式展示
3.文本文件
- 由单一特定编码组成的文件,如UTF-8编码
- 由于存在编码,也被看成是存储着的长字符串
- 适用于例如:.txt文件、.py文件
4.二进制文件
- 直接由比特0和1组成,没有字符编码
- 一般存在二进制0和1的组织结构,即文件格式
- 适用于例如:.png文件、.avi文件等
二、标准库OS常用命令
os
模块为许多操作系统函数提供了统一的接口。- 这个模块中的大部分函数通过对应平台相关模块实现, 比如
posix
和nt. os
模块会在第一次导入的时候自动加载合适的执行模块.
import os # 导入模块
os.getcwd() # 查看当前路径
os.chdir('D:\\my_files') # 修改当前路径
'D:\\my_files'
os.mkdir("my_file") # 在当前目录下建一个子文件夹,已存在时会报错
os.mkdir("my_file2")
os.listdir() # 查看当前文件夹下的子文件夹
['my_file', 'my_file1']
os.rmdir(' my_file2') # 删除文件夹,文件不存在时会报错
os.remove('a.py ') # 删除一个文件
os.rename('my_file','my_file.doc') # 改变文件的名字
for i in os.listdir():
os.rename(i,'great_'+ i) # 更改当前文件夹下的所有子文件夹的名字
三、文件的打开与关闭
1.open()函数提供7中基本的打开模式
打开模式 | 含义 |
---|---|
‘r’ | 只读模式,如果文件不存在,返回异常FileNotToundError,默认值 |
‘w’ | 覆盖写模式,文件不存在则创建,存在则完全覆盖源文件 |
‘x’ | 创建写模式,文件不存在则创建,存在则返回FileExistsError |
‘a’ | 追加写模式,文件不存在则创建,存在则在源文件最后追加内容 |
‘b’ | 二进制文件模式 |
‘t’ | 文本文件模式,默认值 |
‘+’ | 与r/w/x/a一同使用,在原功能基础上增加同时读写功能 |
type | info |
---|---|
r | 以只读方式打开文件。文件的指针在文件开头,默认模式 |
w | 打开文件只用于写入。若文件存在则覆盖,不存在则创建 |
a | 打开文件用于追加。若文件存在,指针会在文件结尾,若文件不存在,创建新文件写入 |
rb | 以二进制格式打开一个文件同于只读。文件指针在文件开头 |
wb | 以二进制格式打开文件只用于写入。若文件存在则覆盖,不存在则创建新文件 |
ab | 以二进制格式打开文件用于追加。若文件存在指针在文件结尾,若文件不存在则创建新文件写入 |
r+ | 打开一个文件用于读写,文件指针在文件开头 |
w+ | 打开一个文件用于读写。若文件已存在则将其覆盖,不存在则创建新文件 |
a+ | 打开一个文件用于读写。若文件已存在,文件指针会放在文件结尾。文件打开时会是追加模式 |
rb+ | 以二进制格式打开一个文件用于读写。文件指针在文件开头 |
wb+ | 以二进制格式打开一个文件用于读写。覆盖写模式 |
ab+ | 以二进制格式打开一个文件用于追加。追加写模式 |
2.文件关闭 f.close()
程序执行完毕后,系统会关闭由该程序打开的文件,但更好的做法是在文件使用完毕后,由程序调用close()方法关闭文件。
实际上,计算机中可打开的文件数量是有限的,每打开一个文件,就会占用一个“名额”,当“名额”耗尽后系统可能无法打开新文件,此外,当文件以缓冲方式打开时,磁盘文件与内存间的读写并不是及时的,若程序因异常关闭,可能导致缓冲区中的数据无法写入文件,造成数据丢失。
因此,文件使用完毕后,及时使用close()关闭文件是有必要的
f = open('b.txt','r') # 只打开存在的文件,还没有创建文件时会报错
f.close()
f = open('b.txt','w') # 创建了b.txt文件用于覆盖写
f = tell() # 0 当前光标的位置为0
f.write('hello world") # 在b.txt文件里写入hello world
f.read() # 不可读,报错
f.close()
f = open('b.txt','x') # b.txt文件已存在,会报错
f = open('b.txt','r')
f.read() # 'hello world' 读出文件的内容
f.read() # '' 读完一次后,指针位于文档最后,再次读内容为空
f.close()
f.close()
f = open('b.txt','r')
f.read() # 'hello world' 关闭文件后再打开,指针回到文档起点
由于文件读写时都有可能产生IOError,一旦出错,后面的f.close()就不会调用了,为了保证无论是否出错都能正确关闭文件,使用try … finally 来实现:
try:
f = open('/path/to/file','r')
print(f.read())
finally:
if f:
f.close()
但是每次这么写太过繁琐,Python引入了with语句来自动帮我们调用close(0方法:
with open('/path/to/file','r') as f:
print(f.read())
3. f.read ()读取全部文件内容
这和try … finally 是一样的,但是代码更简洁,并且不必调用f.close()方法
- 调用read()会一次读取文件的全部内容,如果文件有10G,内存就爆了
- 保险起见,可以反复调用read(size)方法,每次最多读取size个字节的内容
- 调用readline()可以每次读取一行内容,调用readline()一次读取所有内容并按行返回list。因此要根据需要觉得怎么调用
- 如果文件很小,read()一次性读取最方便;若果不确定文件大小,反复调用readl(size)比较保险;如果是配置文件,调用readline()最方便
#把末尾的'\n'在strip() 函数中可以把目标内容line里所有的空格,空行等都删掉,只剩余文字内容
for line in f.readline():
print(line.strip())
f = open('b.txt')
f.read(5) # 'hello' 从b.txt中读取5个字符
f.read(2) # ' w' 从上次读取的地方继续往后读取两个字符
4. f.tell()
用户通过tell()方法获取当前的读写位置
f = open('b.txt')
f.tell() # 0 打开文件后,磨人的读写位置为0
f.read(3) # 'hel'
f.tell() # 3
5. f.seek()
一般情况下,文件的读写是顺序的,但并非每次的读写都需要从当前位置开始,python提供了seek方法可控制文件的读写位置,实现文件的随机读写
seek(offset,from)
offset 表示偏移量,即读写位置需要移动的字节数;from用于指定文件的读写位置,改参数取值0、1、2代表含义如下:
- 0:表示文件开头
- 1:表示使用当前读写位置
- 2:表示文件末尾
f = open('b.txt','w')
f.tell() # 0
f.write('hello world')
f.close()
f = open('b.txt','a+')
f.read() # '' 追加读写模式,指针在文件末尾
f.seek(0,0) # 0 将指针移到文件开头
f.read() # 'hello world' 从开头读取文件内容
f.seek(3,0) # 3 将指针移到第三个字符后
f.read() # 'lo world' 从第三个字符后开始读取文件内容
f.close()