1.文件的使用
1.1 文件类型
-
-
文本文件一般由单一特定编码的字符组成,如UTF-8编码,内容容易统一展示和阅读。
-
二进制文件直接由比特0和比特1组成,文件内部数据的组织格式与文件用途有关。
-
二进制是信息按照非字符但特定格式形成的文件,例如:png格式的图片文件,avi格式的视频文件。
-
二进制文件和文本文件最主要的区别在于是否统一的字符编码。
-
无论文件创建为文本文件或者二进制文件,都可以用"文本文件方式"和"二进制文件方式"打开。但打开后的操作不同。
-
采用文本方式读入文件, 文件经过编码形成字符串, 打印出有含义的字符;
-
采用二进制方式打开文件, 文件被解析为字节流。
1.2 文件的打开
-
-
python3中移除了全局函数file()函数,保留了open函数。文件的打开或者创建可以使用open()函数。该函数可以指定处理模式,设置打开的文件为只读,只写或可读,可写状态。
-
通过open()函数打开一个文件,将返回一个操作这个文件的变量file。
# 语法形式: <变量名> = open(<文件路径及文件名>, <打开模式>) # open函数源码: open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True) # 代码解析: # file:被打开的文件名称,如果文件file不存在,open()将创建名为name的文件,然后再打开该文件。 # mode:指文件的打开模式。 # buffering:设置缓存模式。0表示不缓存,1表示行缓存;如果大于1则表示缓冲区的大小,以字节为单位。 # encoding:显示文件的编码类型。 # newline:文件使用的换行模式。 # closed:判断文件是否关闭,如果文件被关闭,返回True
- 文件的打开模式:
模式 | 含义 |
r | 只读模式, 如果文件不存在, 返回异常FileNotFoundError, 默认值 |
w | 覆盖写模式, 文件不存在则创建, 存在则完全覆盖源文件 |
x | 创建写模式, 文件不存在则创建, 存在则返回异常FileExistsError |
a | 追加写模式, 文件不存在则创建, 存在则在原文件最后追加内容 |
b | 二进制文件模式 |
t | 文本文件模式, 默认值 |
+ | 与r/w/x/a一同使用, 在原功能基础上增加同时读写功能 |
- 上述打开模式中, 'r'、 'w'、 'x'、 'b'可以和'b'、 't'、 '+'组合使用, 形成既表达读写又表达文件模式的方式。
- 对于图片,视频等文件必须使用 'b' 模式。
1.3 文件的关闭
文件使用结束后要用close()方法关闭, 释放文件的使用授权 :
<变量名>.close()
1.4 文件的读取-read
# f.read(size=-1): 从文件中读入整个文件内容。参数可选,如果给出,读入前size长度的字符串或字节流,返回字符串。 f = open(r"F:\code\shopxo\test", "r",encoding="utf-8") r = f.read() print(r) print(type(r)) f.close()
# 通过控制read()参数的值,返回指定字节的内容 f = open(r"F:\code\shopxo\test", "r",encoding="utf-8") r = f.read(5) # 返回前5个字节的内容 print(r) print(type(r)) f.close()
1.5 文件的读取-readlines()
# f.readlines(hint=-1) 从文件中读入所有行,以每行为元素形成一个列表。参数可选,如果给出,读入hint行。 f = open(r"F:\code\shopxo\test", "r",encoding="utf-8") r = f.readlines() print(r) print(type(r)) f.close()
1.6 文件的读取-readline()
# readline()每次读取文件中的一行,需要使用永真表达式读取文件。但当文件指针移到到文件的末尾时,依然使用readline()读取文件将出现错误,因此需要添加一个判断语句。 # redline():每次读取文件中的一行内容 f = open(r"F:\code\shopxo\test", "r",encoding="utf-8") while True: r = f.readline() if r: print(r) else: break f.close()
1.7 文件的读取-seek()
-
-
f.seek(0)将读取指针移动到文件开头,
-
f.seek(2)将读取指针移动到文件结尾。
f = open(r"F:\code\shopxo\test", "r",encoding="utf-8") s = f.read(3) # 读取前3个字节的内容 print(s) f.seek(0) # 指针移动到文件开头 ls = f.readlines() # 一次性读取所有内容,以列表形式返回 print(ls) f.close()
1.8 文件的读取-遍历循环
f = open(<文件路径及名称>, "r") for line in f: # 处理一行数据 f.close()
f = open(r"F:\code\shopxo\test", "rt", encoding="utf-8") for i in f: print(i) f.close()
1.9 文件的读写-write()
- f.write(s)向文件写入字符串s, 每次写入后, 将会记录一个写入指针。 该方法可以反复调用, 将在写入指针后分批写入内容, 直至文件被关闭。
data = "离离原上草,\n一岁一枯荣,\n野火烧不尽,\n春风吹又生。" f = open(r"F:\code\shopxo\test", "w", encoding="utf-8") f.write(data) # f.write("离离原上草,\n") # \n:换行 # f.write("一岁一枯荣,\n") # f.write("野火烧不尽,\n") # f.write("春风吹又生。\n") f.close()
1.10 文件的读写-writelines()
# f.writelines(lines)直接将列表类型的各元素连接起来写入文件。 data = ['新年都未有芳华,\n', '二月初惊见草芽。\n','白雪却嫌春色晚,\n','故穿庭树作飞花。'] f = open(r"F:\code\shopxo\test", "w", encoding="utf-8") f.writelines(data) f.close()
1.11 文件的删除
-
-
os模块常用的文件处理函数:
函数 | 含义 |
access(path,mode) | 按照mode指定的权限访问文件 |
chmod(path,mode) | 改变文件的访问权限,mode用UNIX系统中的权限代号表示 |
open(filename,flag[mode=0777]) | 按照mode指定的权限打开文件,默认(用户读、写、执行的权限) |
remove(path) | 删除path指定的文件 |
rename(old,new) | 重命名文件或目录,old表示原文件或目录,new表示新文件或目录 |
stat(path) | 返回path指定的文件的所有属性 |
fstat(path) | 返回打开的文件的所有属性 |
lseek(fd,pos,how) | 设置文件的当前位置,返回当前位置的字节数 |
start file(filepath[, operation] ) | 启动关联程序打开文件。例如, 打开的是一个html文件, 将启动IE浏览器 |
tmpfile() | 创建一个临时文件,文件创建在操作系统的临时目录中 |
- os.path模块常用的函数:
函数 | 描述 |
abspath(path) | 返回path所在的绝对路径 |
dima me(p) | 返回目录的路径 |
exists(path) | 判断文件是否存在 |
getatime(filename) | 返回文件的最后访问时间 |
getctime(filename) | 返回文件的创建时间 |
getmtime(filename) | 返回文件最后的修改时间 |
getsize(filename) | 返回文件的大小 |
is abs(s) | 测试路径是否是绝对路径 |
is dir(path) | 判断path指定的是否是目录 |
is file(path) | 判断path指定的是否是文件 |
split(p) | 对路径进行分隔,并以列表的方式返回 |
split ext(p) | 从路径中分割文件的扩展名 |
split drive(p) | 从路径中分割驱动器的名称 |
walk(top, func, arg) | 遍历目录数, 与os.walk() 的功能相同 |
import os a = open(r'F:\code\shopxo\test.txt', 'w') if os.path.exists(r'F:\code\shopxo\test.txt'): # 判断文件是否存在 print('文件的所有属性:{}'.format(os.stat(r'F:\code\shopxo\test.txt'))) print('文件的大小:{}'.format(os.path.getsize(r'F:\code\shopxo\test.txt'))) os.remove(r'F:\code\shopxo\test.txt') # 删除文件 else: print('文件不存在')
1.12 文件的删除
- 没有直接提供复制文件的方法,但是可以使用read(),write()方法同样可以实现复制文件的功能。
# 创建文件:hello.txt txt = open('hello.txt', 'w') data = ['鹅鹅鹅\n', '曲颈向天歌'] txt.writelines(data) txt.close() # 创建文件:hello1.txt txt = open('hello.txt', 'r') txt_1 = open('hello1.txt', 'w') txt_1.write(txt.read()) txt.close() txt_1.close()
-
-
copyfile()函数可以实现文件的复制,文件的剪切可以使用move()函数实现。
import shutil shutil copyfile('hello.text', 'hello_1.text') # 将hello.text内容复制给hello_1.text shutil.move('hello.text', '../') # 将hello.text文件移到到当前目录的父目录下 shutil.move('hello.text', 'hello_2.text') # 修改文件名
1.13 文件内容的搜索与替换
- 文件内容的搜索与替换通过结合字符串查找和替换来实现。
# 文件的查找 import re f = open('hello.text', 'r') count = 0 for s in f.readlines(): # 每一次读取一行数据到变量s li = re.findall('hello', s) # 使用findall()查询变量s,并将结果存储到列表li中 if len(li) > 0: # 判断列表长度>0 count = count +li.count('hello') # 统计列表中'hello'出现的次数 print('查找到' + str(count) + '个hello') f.close()
# 文件的替换 f1 = open('hello.text', 'r') f2 = open('hello1.text', 'w') for s in f1.readlines(): f2.write(s.replace('hello', 'hi')) # replace替换s中的'hello',然后结果写入hello1.text文件 f1.close() f2.close()
2.目录操作
- python中的os模块和os.path模块提供了一些针对目录操作的函数
2.1 创建和删除目录
- os中常用的目录处理函数:
函数 | 说明 |
mkdir(path[,mode=0777]) | 创建path指定的一个目录 |
makedirs(name, mode=511) | 创建多级目录,name表示为'path1/path2...' |
rmdir(path) | 删除path指定的目录 |
removedirs(path) | 删除path指定的多级目录 |
listdir(path) | 返回path指定目录下所有的文件名 |
getwd() | 返回当前的工作目录 |
chdir(path) | 改变当前目录为path指定的目录 |
walk(top,topdown=True,οnerrοr=None) | 遍历目录树 |
# 目录的基本操作: import os os.mkdir("test") # 创建空目录 os.rmdir("test") # 删除空目录 os.makedirs("testinh/a") # 创建多级空目录 os.removedirs("testinh/a") # 删除多级空目录 print(os.getced()) # 获取当前所在目录
2.2 目录的遍历
目录的遍历有两种实现方法:递归函数、os.walk()
# 递归函数 import os def VisitDir(path): li = os.listdir(path) # 获取路径下所有的目录名和文件名 for p in li: pathname = os.path.join(path, p) # 获取文件的完整路径 if not os.path.isfile(pathname): # 判断pathname是否为文件 VisitDir(pathname) # 如果pathname为目录,则继续遍历 else: print(pathname) if __name__ == '__main__': path = r'F:\pycharm\Demo' VisitDir(path)
# os.walk()用于目录的遍历,功能类似于os.path模块的函数walk() import os def VisitDir(path): for root, dirs, files in os.walk(path): for filepath in files: print(os.path.join(root, filepath)) if __name__ == '__main__': path = r'F:\pycharm\Demo' VisitDir(path)
3.
-
-
根据数据的关系不同, 数据组织可以分为: 一维数据、 二维数据和高维数据。
-
一维数据:由对等关系的有序或无序数据构成, 采用线性方式组织 。例如:北京、 上海、 天津、 重庆 。
-
二维数据:由关联关系数据构成,采用二维表格方式组织 。例如:excel表格。
-
高维数据:由键值对类型的数据构成, 采用对象方式组织, 可以多层嵌套。 例如:HTML,XML,json数据
3.1 一维数据
-
一维数据由于是线性结构, 在Python语言中主要采用列表形式表示。
-
一维数据的文件存储有多种方式, 总体思路是采用特殊字符分隔各数据。
-
常用存储方法包括4种。
-
采用空格分隔元素 。
-
采用逗号分隔元素 。
-
采用换行分隔包括 。
-
其他特殊符号分隔。
-
# 一维数据的存储:列表对象输出为CSV格式文件 ls = ['北京', '上海', '天津', '重庆'] f = open('city.csv', 'w') f.write(','.join(ls)+'\n') f.close()
# 一维数据的处理:将CSV格式文件,读入一维数据, 并将其表示为列表对象。 f = open('city.csv','r') ls = f.read().strip('\n').split(',') f.close() print(ls)
3.2 二维数据
-
-
二维数据由一维数据组成, 用CSV格式文件存储。CSV文件的每一行是一维数据, 整个CSV文件是一个二维数据。
# 二维列表对象输出为CSV格式文件 ls = [ ['指标', '2014年', '2015年', '2016年'], ['居民消费价格指数', '102', '101.4', '102'], ['食品', '103.1', '102.3', '104.6'], ['烟酒及用品', '994', '102.1', '101.5'], ['衣着', '102.4', '102.7', '101.4'], ['家庭设备用品', '101.2', '101', '100.5'], ['医疗保健和个人用品', '101.3', '102', '101.1'], ['交通和通信', '99.9', '98.3', '98.7'], ['娱乐教育文化', '101.9', '101.4', '101.6'], ['居住', '102', '100.7', '101.6'], ] f = open('cpi.csv', 'w') for row in ls: f.write(','.join(row)+'\n') f.close()
# 从CSV文件读取二维数据 f = open('cpi.csv', 'r') ls = [] for line in f: ls.append(line.strip('\n').split(',')) f.close() print(ls)
# 二维数据处理为表格形式 for row in ls: for item in row: <对第row行第item列元素进行处理> # 对二维数据进行格式化输出, 打印成表格形状 f = open('cpi.csv', 'r') ls = [] for line in f: ls.append(line.strip('\n').split(',')) f.close() for row in ls: line = '' for item in row: line += '{:12}\t'.format(item) print(line)