文件操作

一  文件操作

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 归档文件的工具
原文地址:https://www.cnblogs.com/mushuiyishan/p/10460948.html