Chinaunix首页 | 论坛 | 博客
  • 博客访问: 86555
  • 博文数量: 26
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 250
  • 用 户 组: 普通用户
  • 注册时间: 2015-08-12 22:31
文章分类

全部博文(26)

文章存档

2016年(26)

我的朋友

分类: Python/Ruby

2016-12-09 15:57:27

一,文件打开模式:



r 以只读的模式打开,该文件必须存在,否则会报错。


w 以只写的模式打开,若文件存在则文件长度清为0,即该文件内容会消失。
若文件不存在则建立该文件。 
 
a 以追加的模式打开,若文件不存在,则会建立该文件,如果文件存在,
写入的数据会被加到文件尾,即文件原先的内容会被保留。
 
x   python3之后加上去的,如果文件存在,则报错,不存在则创建并只写



rb      #详见下文
wb
ab



r+ 打开可读写的文件,该文件必须存在。不会创建不存在的文件,从顶部开始写,
会覆盖之后此位置的内容(常用,因为可以用seek调整从哪开始写,但是要注意
会向后覆盖,如果碰到汉字,汉字一般包含3个字节,如果从第2个开始则会出现
乱码。可以参考seek的用法)


w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。
若文件不存在则建立该文件。 


a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,
写入的数据会被加到文件尾后,即文件原先的内容会被保留。 



r+b 以读写的模式打开(默认按字符串向后读,如果加b,则按字节向后读)
(b代表二进制,一般在程序需要跨平台的时候会使用)

w+b 以读写的模式打开

a+b 以追加及读模式打开



二,文件操作



f = file('/etc/passwd')
f.readline()   一次只读一行
f.readlines() 返回的是读到的行的一个列表
f.read()   无参数,读全部,有参数(有b按字节读,无b按字符读)。
f.read(5),表示读取前5个字符/字节。


f.readlines()   一次只读取一行(不会因为文件太大,在读取的时候而出现内存不足)
f2.readable() 是否可读
f.seek() 跳转到一个指定的位置(按字节找,不管是有中文,还是字符都一样)
f.tell() 获取当前所在位置(按字节)
f.truncate()    截取文件,指针位置后面的将被清空
f.write() 先清空文件写数据。(有b时,按字节写;无b时,按字符写)
f.flush() 强制把数据从内存刷到硬盘


f.close()       关闭文件
f.writelines()
f.closed        测试文件是否关闭 
注意open和file都可以对文件进行处理,没有区别。但是在python3中只保留open



三,关于文件操作的模式是否带b,以及乱码问题的处理?





1,我们在对文件进行操作时不加b的情况下,打开读取,写入都是以字符串的形式来进行。
而我们保存在硬盘上的数据只可能是二进制(二进制的表现形式就是字节类型),这中间
python内部帮助我们做了转换,把字符转换成字节,不需要我们自己来做。

注意:我们在写数据,保存数据的时候最好养成一个好的习惯,即以什么编码写的就以什么
编码来打开,否则会出现乱码的情况。


2,(rb,wb,ab)只要加b,就表示不需要python来帮我们来做,我们直接跟二进制打交道。
这时候我们在写的时候也必须写字节,否则会报错。以后做跨平台项目时经常用+b的模式。


  1. 如:
  2.     cat user.txt #查看文件内容
  3.     yn:yn123
  4.     tom:tom123
  5.     ----------------
  6.     with open('user.txt','rb') as f1:
  7.         for line in f1:
  8.             print(line,type(line))

  9.     with open('user.txt','ab') as f2:
  10.         f2.write(bytes("李杰", encoding="utf-8")) #如果不用bytes进行转换则会报错。
  11.             
  12.     
  13.     结果:
  14.     b'yn:yn123\r\n' <class 'bytes'>
  15.     b'tom:tom123' <class 'bytes'>        #可以看出都是字节类型
  16.     
  17.     -----------------
  18.     cat user.txt
  19.     yn:yn123
  20.     tom:tom123李杰 #再次查看文件内容
  21.     -----------------




四,补充:



1)如何对文件对象进行迭代
f1 = open('user.txt','r',encoding='utf-8')
for line in f1:
print(line)   #一行一行的读取文件

2) 文件操作with处理上下文(2.7以后with可以打开两个文件)

(a),把db1的前十行,写入db2的前十行


  1. with open('db1','r',encoding="utf-8") as f1,open('db2','w',encoding="utf-8") as f2:
  2.             times = 0
  3.             for line in f1:
  4.                 times += 1
  5.                 if times <= 10:
  6.                     f2.write(line)
  7.                 else:
  8.                     break


(b),修改文件,把'alex'替换成'st'


  1. with open('db1','r',encoding="utf-8") as f1,open('db2','w',encoding="utf-8") as f2:
  2.             for line in f1:
  3.                 new_str = line.replace('alex','st')
  4.                 f2.write(new_str)



阅读(1174) | 评论(0) | 转发(0) |
0

上一篇:内置函数

下一篇:装饰器

给主人留下些什么吧!~~