一 文件操作
1. 斜杠 / 和反斜杠 的区别
Unix使用斜杆/ 作为路径分隔符,而web应用最新使用在Unix系统上面,所以目前所有的网络地址都采用 斜杆/ 作为分隔符。
Windows由于使用 斜杆/ 作为DOS命令提示符的参数标志了,为了不混淆,所以采用 反斜杠 作为路径分隔符。所以目前windows系统上的文件浏览器都是用 反斜杠 作为路径分隔符。随着发展,DOS系统已经被淘汰了,命令提示符也用的很少,斜杆和反斜杠在大多数情况下可以互换(在cmd中可以互换),没有影响。
总结如下:
(1)浏览器地址栏网址使用 斜杆/ ;
(2)windows文件浏览器上使用 反斜杠 ;
(3)出现在html url() 属性中的路径,指定的路径是网络路径,所以必须用斜杆/ ;
1 <div style="background-image:url(/Image/Control/title.jpg); background-repeat:repeat-x; padding:10px 10px 10px 10px"></div> 2 // 如果url后面用反斜杠,就不会显示任何背景
(4)出现在普通字符串中的路径,如果代表的是windows文件路径,则使用 斜杆/ 和 反斜杠 是一样的;如果代表的是网络文件路径,则必须使用 斜杆/ ;
1 <img src=".Image/Control/ding.jpg" /> // 本地文件路径,/ 和 是等效的 2 <img src="./ImageControlcai.jpg" /> 3 <img src="http://hiphotos.baidu.com/yuhua522/pic/item/01a949c67e1023549c163df2.jpg" /> // 网络文件路径,一定要使用 斜杆/
在编程中,反斜杠表示转义字符的开始或者路径分隔符。
如用一个字符串存储保存文件的路径时,路径为F:caffeTempimage.jpg,有以下两种方法
- 1、多加一个反斜杠,相当于前面对后面的进行转转义,str=‘’F:\caffe\Temp\image.jpg‘’
- 2、路径的整体前面加一个r,str=r‘’F:\caffe\Temp\image.jpg‘’。(推荐)
首先使用正斜杠,若报错在使用反斜杠
#打开上目录中的123文件 f = open('./123.txt') #windows中大部分正斜杠和反斜杠可以互换 f = open('.123.txt') #报错,此处的反斜杠为转义符开始 f = open('.\123.txt')
2. 绝对路径和相对路径
目录就是文件夹
绝对路径:是从盘符开始的路径,形如C:/windows/system32/cmd.exe
相对路径:是从当前路径开始的路径,假如当前路径为C:/windows,要描述上述路径,只需输入system32/cmd.exe 。(推荐)
实际上,严格的相对路径写法应为 ./system32/cmd.exe,其中,.表示当前目录,在通道情况下可以省略,只有在特殊的情况下不能省略。
假如当前路径为c:/program files 要调用上述命令,则需要输入../windows/system32/cmd.exe 其中,..为父目录。
当前路径如果为c:/program files/common files则需要输入 ../../windows/system32/cmd.exe
另外,还有一种不包含盘符的特殊绝对路径,形如 /windows/system32/cmd.exe 无论当前路径是什么,会自动地从当前盘的根目录开始查找指定的程序
- ./file/ 当前目录下的file文件夹
- ../file/ 上一目录下的file文件夹
- /file/ 磁盘根目录、 项目根目录(具体视情况而定)
3. 打开文件模式:
1 open('filename') 2 with open('filename') as f: 3 pass
open函数使用一个文件名作为唯一的强制参数,然后返回一个文件对象。模式和缓冲参数都是可选的,默认为只读模式打开文件。使用with即使发生错误可以关闭文件。
打开方式有以下:
- r, 只读模式(默认)。
- w,只写模式。不可读; 不存在则创建;存在则删除内容;
- a,追加模式。不可读; 不存在则创建;存在则只追加内容;
"+" 表示可以同时读写某个文件
- r+, 读写 【可读;可写】
- w+,写读 【可读;可写】
- a+, 写读 【可读;可写】
"U"表示在读取时,可以将 自动转换成 (与 r 或 r+ 模式同使用)
- rU
- r+U
"b"表示处理二进制文件(如:非文本,比如视频,图片等文件)
- rb/rb+
- wb/wb+
- ab/ab+
1 文件模式 操作 2 r 以只读方式打开 3 rU 或 Ua 以读方式打开, 同时提供通用换行符支持 (PEP 278) 4 w 以写方式打开 (必要时清空) 5 a 以追加模式打开 (从 EOF 开始, 必要时创建新文件) 6 r+ 以读写模式打开 7 w+ 以读写模式打开 (参见 w ) 8 a+ 以读写模式打开 (参见 a ) 9 rb 以二进制读模式打开 10 wb 以二进制写模式打开 (参见 w ) 11 ab 以二进制追加模式打开 (参见 a ) 12 rb+ 以二进制读写模式打开 (参见 r+ ) 13 wb+ 以二进制读写模式打开 (参见 w+ ) 14 ab+ 以二进制读写模式打开 (参见 a+ ) 15 x 如果文件存在报错,不存在则创建 16 ***加b模式打开,不可以在指定encoding,切写入时也需要转换为字节写入文件
4. 只读模式 r,rb
4.1 r模式
以只读方式打开文件,文件的指针将会放在文件的开头。是文件操作最常用的模式,也是默认模式。
f = open('matt.txt',mode='r',encoding='utf-8') msg = f.read() f.close() #最后关闭文件
4.2 文件读取方式
1、read() 将文件中的内容全部读取出来,弊端 如果文件很大就会非常的占用内存,容易导致内存奔溃。
2、read(size) 指定读取到size个字符位置。
3、readline() 读取每次只读取一行,注意点:readline()读取出来的数据在后面都有一个 。
解决方法:
- 读出的语句加strip()
- 打印时设置末尾为空(默认为换行 )
f = open('./matt') msg1= f.readline() msg2= f.readline().strip() #添加strip() msg3= f.readline() msg4= f.readline() print(msg1) print(msg2) print(msg3,end='') #设置末尾为空 print(msg4) f.close()
matt1
matt2
matt3
matt4
4、readlines() 返回一个列表,列表里面每个元素是原文件的每一行,如果文件很大,占内存,容易崩盘。
5、for循环 文件句柄是一个迭代器,他的特点就是每次循环只在内存中占一行的数据,非常节省内存。(推荐)
f = open('./matt') for i in f: #i代表每一行的数据,最末端也有 print(i.strip()) f.close()
4.3 rb模式
以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。主要是操作非文字文件:图片,音频,视频等,不用声明编码方式。
rb模式也有read read(n) readline(),readlines() for循环这几种方法。
5. 只写模式w,wb
如果文件不存在,利用w模式操作文件,那么它会先创建文件,然后写入内容。
如果文件存在,利用w模式操作文件,先清空原文件内容,在写入新内容。
写入方法:
1、f.write(str) 把str写到文件中,write()并不会在str后加上一个换行符。
2、fp.writelines(seq) 把seq的内容全部写到文件中(多行一次性写入)。这个函数也只是忠实地写入,不会在每行后面加上任何东西。
复制文件实例
f = open('./matt') msg = f.read() f.close() f = open('./matt2', 'w') f.write(msg) f.close()
6. 追加模式a,ab
打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
追加模式下,及时移动光标,也不能读取,not readable。
7. 写读r+,rb+ 读写w+、wb+追加读a+,ab+
1、写读r+、rb+(推荐)
对于读写模式.,必须是先读。因为默认光标是在开头的. 当读完了之后再进写入。我们以后使用频率最高的模式就是r+ 。
r+模式下.,必须是先读取, 然后再写入 。
#正确写法
f = open("./matt", mode="r+", encoding="utf-8") content = f.read() f.write("123") print(content) f.flush() f.close() #正常的读取之后, 写在结尾
#错误写法
f = open("./matt", mode="r+", encoding="utf-8") f.write("123") content = f.read() print(content) f.flush() f.close() #将开头的内容改写成了"123", 然后读取的内容是后边的内容。
#移动光标位置
f = open("./matt", mode="r+", encoding="utf-8") f.seek(10) f.write("123") content = f.read() print(content) f.flush() f.close()
#结果为:读取从光标处读取,写入在最后
matt3
matt4
matt5123
注意: 在r+模式下,如果读取了内容,不论读取内容多少.,光标显示的是多少.。再写入或者操作文件的时候都是在结尾进行的操作。
2、读写w+,wb+
先将所有的内容清空.,然后写入,最后读取.。但是读取的内容是空的,,不常用。
先读不就好了么? 错.,w+ 模式下, 开始读取不到数据. 然后写的时候再将原来内容清空,所以,很少用
3、 追加读a+,ab+
a+模式下, 不论先读还是后读,都是读取不到数据的 。
8. 其余操作方法
1、f.tell() 返回光标位置
2、f.seek(size,2) 定位光标,移动单位是byte,seek的第二个参数表示的是从哪个位置进行偏移,默认是0,表示开头,1表示当前位置,2表示结尾
3、f.flush() 刷新文件的内部缓冲区, 强制保存
4、f.truncate(size) 截断数据,仅保留指定之前数据,以byte为单位
想做截断操作,记住了,要先挪动光标,挪动到你想要截断的位置,然后再进行截断。关于truncate(n), 如果给出了n,则从开头进行截断,如果不给n,则从当前位置截断,后边的内容将会被删除 。
5、close() 关闭文件,否则会丢失缓存区数据
6、f.readalbe、f.writeable 判断是否可读、可写
9. with语句
当with代码块执行完毕时,内部会自动关闭句柄,释放文件资源。
with open('file', 'r') as file1, #续行符
('files' , 'r') as files2:
可同时打开多个文件,修改文件时,采用此方法
10. 修改文件
1、一次性全部读取文件内容:
import os # 调用系统模块 with open('a') as read_f,open('a_swap','w') as write_f: data=read_f.read() #全部读入内存,如果文件很大,会很卡 data=data.replace('a','A') #在内存中完成修改 replace(old,new) write_f.write(data) #一次性写入新文件 os.remove('a') #删除原文件 os.rename('a_swap','a') #将新建的文件重命名为原文件
2、for循环读取:(推荐)
import os with open('at') as read_f,open('.a_swap','w') as write_f: for line in read_f: line=line.replace('a','A') write_f.write(line) os.remove('a') os.rename('a_swap','a')
11. 文件对象的内建方法列表
文件对象的方法 操作 file.close() 关闭文件 file.fileno() 返回文件的描述符(file descriptor ,FD, 整数值) file.flush() 刷新文件的内部缓冲区 file.isatty() 判断 file 是否是一个类 tty 设备 file.nexta() 返回文件的下一行(类似于 file.readline() ), 或在没有其它行时引发 StopIteration 异常 file.read(size=-1) 从文件读取 size 个字节, 当未给定 size 或给定负值的时候, 读取剩余的所有字节, 然后作为字符串返回.如果打开模式无b,则read按字符读取,否则按字节读取 file.readline(size=-1) 从文件中读取并返回一行(包括行结束符), 或返回最大 size file=open('test','ab') file.write(bytes('hehe',encoding='utf-8')) 向文件写入字符串 会覆盖原有数据,坑 file.close() 关闭文件 file.tell获取当前指针的位置 file.read()如果打开模式无b,则read按字符读取,否则按字节读取 file.fileno文件描述符 file.truncat 截断数据,清除文件指针之后的数据 file.seek(off, whence=0) 在文件中移动文件指针, 从 whence ( 0 代表文件其始, 1代表当前位置, 2 代表文件末尾)偏移 off 字节,不论是否有中文,都以字节为单位 file.truncate(size=file.tell()) 截取文件到最大 size 字节, 默认为当前文件位置 file.writelines(seq) 向文件写入字符串序列 seq ; seq 应该是一个返回字符串的可迭代对象 file.readlines(sizhint=0) 读取文件的所有行并作为一个列表返回(包含所有的行结束符);
12. os 模块的文件/目录访问函数
对文件系统的访问大多通过 Python 的 os 模块实现.,该模块是 Python 访问操作系统功能的主要接口。文件和文件夹(目录)的操作不一致。
1、文件处理
mkfifo()/mknod()a 创建命名管道/创建文件系统节点 remove()/unlink() Delete file 删除文件 rename()/renames()b 重命名文件 *statc() 返回文件信息 symlink() 创建符号链接 utime() 更新时间戳 tmpfile() 创建并打开('w+b')一个新的临时文件 walk()a 生成一个目录树下的所有文件名
2、目录/文件夹
1 chdir()/fchdir()a 改变当前工作目录/通过一个文件描述符改变当前工作目录 2 chroot()d 改变当前进程的根目录 3 listdir() 列出指定目录的文件 4 getcwd()/getcwdu()a返回当前工作目录/功能相同, 但返回一个 Unicode 对象 5 mkdir()/makedirs() 创建目录/创建多层目录 6 rmdir()/removedirs() 删除目录/删除多层目录
访问/权限
1 access() 检验权限模式 2 chmod() 改变权限模式 3 chown()/lchown()a 改变 owner 和 group ID/功能相同, 但不会跟踪链接 4 umask() 设置默认权限模式
13. os.path 模块中的路径名访问函数
可以完成一些针对路径名的操作.。它提供的函数可以完成管理和操作文件路径名中的各个部分,获取文件或子目录信息,文件路径查询等操作
1、分隔
1 basename() 去掉目录路径, 返回文件名 2 dirname() 去掉文件名, 返回目录路径 3 join() 将分离的各部分组合成一个路径名 4 split() 返回 (dirname(), basename()) 元组 5 splitdrive() 返回 (drivename, pathname) 元组 6 splitext() 返回 (filename, extension) 元组
2、信息
1 getatime() 返回最近访问时间 2 getctime() 返回文件创建时间 3 getmtime() 返回最近文件修改时间 4 getsize() 返回文件大小(以字节为单位)
3、查询
1 exists() 指定路径(文件或目录)是否存在 2 isabs() 指定路径是否为绝对路径 3 isdir() 指定路径是否存在且为一个目录 4 isfile() 指定路径是否存在且为一个文件 5 islink() 指定路径是否存在且为一个符号链接 6 ismount() 指定路径是否存在且为一个挂载点 7 samefile() 两个路径名是否指向同个文件
4、还有大量的其它模块与文件和输入/输出有关, 它们中的大多数都可以在主流平台上工作.
1 base64 提供二进制字符串和文本字符串间的编码/解码操作 2 binascii 提供二进制和 ASCII 编码的二进制字符串间的编码/解码操作 3 bz2a 访问 BZ2 格式的压缩文件 4 csv 访问 csv 文件(逗号分隔文件) 5 filecmpb 用于比较目录和文件 6 fileinput 提供多个文本文件的行迭代器 7 getopt/optparsea 提供了命令行参数的解析/处理 8 glob/fnmatch 提供 Unix 样式的通配符匹配的功能 9 gzip/zlib 读写 GNU zip( gzip) 文件(压缩需要 zlib 模块) 10 shutil 提供高级文件访问功能 11 c/StringIO 对字符串对象提供类文件接口 12 tarfilea 读写 TAR 归档文件, 支持压缩文件 13 tempfile 创建一个临时文件(名) 14 uu 格式的编码和解码 15 zipfilec 用于读取 ZIP 归档文件的工具