一、文件概述及编码
1.1文件的定义
计算机文件是一个存储在存储器上的数据序列,可以包含任何数据内容。
文件包括两种类型:文本文件和二进制文件。
文本文件:存储的是普通“字符”文本,默认为Unicode字符集,可以使用记事本程序打开
二进制文件:把数据内容用“字节”进行存储,无法用记事本打开,必须使用专用的软件打开,举例:mp3音频文件,jpg图片,doc文档等
二进制文件和文本文件本质上没有区别,只是没有统一的编码,需要根据特定的程序进行解析和运行。
无论是文本文件还是二进制文件都可以用"文本文件方式"和"二进制文件方式"打开,打开后的操作不同。
1.2字符编码
ascii码:
只有英文字母和常见字符,一个字符占一个字节大小
gb2312:
简体的中文字符集,两个字节表示一个汉字
gbk:
在gb2312的基础上新增了繁体字及罕用字,两个字节表示一个汉字
unicode:
将世界上所有的符号纳入其中,两个字节表示一个汉字
utf-8:
提高unicode的编码小了,一个字节表示英文字母,三个字节表示一个汉字
1.3Python的编码格式
Python的解释器使用的是Unicode(内存)
.py文件在磁盘上使用UTF-8存储(外存)
二、Python的文件操作
2.1文件的读写原理
文件的读写俗称‘IO操作’ (input、output)
文件读写操作流程、操作原理
2.2 open打开文件
open(file, mode='r', encoding=None)
-
file是包含文件名的字符串,可以为绝对路径,也可以是相对路径
相对路径:参照标准为当前脚本 .表示当前目录 ..表示上级目录
当前目录下a.txt文件: ./a.txt 或 a.txt ./可省略
上级目录下a.txt文件 : ../a.txt ../../../x.txt
绝对路径:参照标准是系统的根目录
linux系统:/temp/xxx
windows系统:c:\xxx\xxx\xxx(注意在文件路径前增加‘r’使路径不转移 r'c:\xxx\xxx\xxx')
一般情况下项目本身的资源文件和脚本路径相对固定,为了不影响项目的移植性,必须使用相对路径。
如果需要读取操作系统中固定位置的系统文件一般使用绝对路径。
-
mode 一个可选字符串,用于指定打开文件的模式。默认值
r
表示文本读。打开模式 描述 r 以只读模式打开文件,文件的指针将会放在文件的开头 w 以只写模式打开文件,如果文件不存在则创建,如果文件存在,则覆盖原有内容(清空文件原内容),文件指针在文件的开头 a 以追加模式打开文件,如果文件不存在则创建,文件指针在文件开头,如果文件存在,则在文件末尾追加内容,文件指针在原文件末尾 b 以二进制方式打开文件,不能单独使用,需要与其它模式一起使用,rb或者wb + 以读写方式打开文件,不能单独使用,需要与其它模式一起使用,如a+(读追加写)、r+(读写) x 以写入模式打开文件,当文件不存在则创建,文件存在则报错 -
encoding 文本模式下指定文件的字符编码
file=open('a.txt','r')
print(file.readlines())
file.close()
2.3 with上下文管理器
使用open函数打开文件后,需手动关闭文件释放内存, 而with语句可以自动管理上下文资源,不论什么原因跳出with都能确保文件正确的关闭,以此来达到释放资源的目的
只写:w
with open('a.txt', 'w', encoding='utf-8') as fb:
fb.write('test\n')
fb.write('hello world;\n')
追加:a
with open('a.txt', 'a', encoding='utf-8') as fb:
fb.write('1\n233\n')
排他写:x
#在当前目录中创建文件b.txt,存在则不创建
try:
with open('b.txt', 'x', encoding='utf-8') as fb:
fb.write('')
except Exception as e:
print(e)
二进制:r
src_file=open('log.png','rb')
target_file=open('copylog.png','wb')
target_file.write(src_file.read())
target_file.close()
src_file.close()
2.4文件的常用方法
方法名 | 说明 |
---|---|
read([size]) | 从文件中读取size个字节或字符的内容返回,若省略[size],则读取到文件末尾,即一次读取文件所有内容 |
readline() | 从文本文件中读取一行内容 |
readlines() | 把文本文件中每一行都作为独立的字符串对象,并将这些对象放入列表返回 |
write(str) | 将字符串str内容写入文件 |
writelines(s_list) | 将字符串列表s_list写入文本文件,不添加换行符 |
seek(offset[,whence]) | 把文件指针移动到新的位置,offset表示相当于whence的位置:offset:为正往结束方向移动,为负往开始方向移动whence不同的值代表不同含义:0:从文件头开始计算(默认值)1:从当前位置开始计算2:从文件尾开始计算 |
tell() | 返回文件指针的当前位置 |
flush() | 把缓冲区的内容写入文件,但不关闭文件 |
close() | 把缓冲区的内容写入文件,同时关闭文件,释放文件对象相关资源 |
三、目录操作
os模块是Python内置的与操作系统功能和文件系统相关的模块,该模块中的语句的执行结果通常与操作系统有关,在不同的操作系统上运行,得到的结果可能不一样
3.1 os模块常用函数(目录操作)
函数 | 说明 |
---|---|
getcwd() | 返回当前的工作目录 |
listdir(path) | 返回指定路径下的文件和目录信息 |
mkdir(path[,mode]) | 创建目录 |
makedirs(path1/path2....[,mode]) | 创建多级目录 |
rmdir(path) | 删除目录 |
removedirs(path1/path2...) | 删除多级目录 |
chdir(path) | 将path设置尾当前工作目录 |
import os
# os.system('notepad.exe')
ha=os.getcwd()
print(ha)
3.2 os.path模块的常用方法(目录操作)
函数 | 说明 |
---|---|
abspath() | 用于获取文件或目录的绝对路径 |
exists(path) | 用于判断文件或目录是否存在,如果存在返回True,否则返回False |
join(path,name) | 将目录与目录或者文件名拼接起来 |
splitext() | 分离文件名和扩展名 |
basename(path) | 从一个目录中提前文件名 |
dirname(path) | 从一个路径中提取文件路径,不包括文件名 |
isdir(path) | 用于判断是否为路径 |
import os.path
print(os.path.abspath('list.py'))
四、补充:python处理csv文件
4.1读取csv文件
文件内容(a.csv):
name,age,height
zhangsan,14,150
lisi,20,178
wangwu,40,175
# 读取csv文件并解析为嵌套列表
data = []
with open('a.csv', 'r', encoding='gbk') as f:
for line in f:
# 去掉换行符
line = line.strip()
data.append(line.split(','))
4.2将数据写为csv文件
data:
data=[['name', 'age', 'height'], ['zhangsan', '16', '170'], ['lisi', '17', '185'], ['wangwu', '20', '180']]
with open('test.csv', 'w', encoding='utf-8') as f:
for item in data:
f.write(','.join(item) + '\n')