码迷,mamicode.com
首页 > 其他好文 > 详细

03_文件操作

时间:2016-05-24 13:34:14      阅读:474      评论:0      收藏:0      [点我收藏+]

标签:

文件操作

操作文件时,一般需要经历如下步骤:

  • 打开文件
  • 操作文件
  • 关闭文件

 

1、打开文件

格式:文件句柄 = open(‘文件‘, ‘模式‘, encoding=‘字符编码‘)

打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,日后通过此文件句柄对该文件操作。

常规模式:

  •  r - 只读模式(默认)
  • w - 只写模式,不可读;不存在则创建,存在则清空原文件内容
  • x  - 只写模式,不可读;如果文件存在,报错;如果文件不存在,创建并写内容
  • a  - 追加模式,可读;不存在则创建,存在只能追加内容

注:encoding - 指定文件操作字符编码类型,一般常用万国码‘utf-8‘

 

示例:r 模式(只读)

1 f = open("db", "r", encoding="utf-8")
2 data = f.read()    #读取文件内容
3 print(data)
4 f.close()    #关闭文件
5 
6 # 输出结果
7 tom

示例:w 模式(只写,不可读;不存在则创建,存在则清空原文件内容)

 1 # 1.文件存在
 2 f = open("db", "w", encoding="utf-8")
 3 f.write("jarry")
 4 f.close()
 5 
 6 f = open("db", "r", encoding="utf-8")
 7 data = f.read()
 8 print(data)
 9 f.close()
10 
11 #输出结果:清空原内容tom,写入新内容jarry
12 jarry
13 
14 # 2.文件不存在
15 f = open("db2", "w", encoding="utf-8")
16 f.write("tom")
17 f.close()
18 
19 f = open("db2", "r", encoding="utf-8")
20 data = f.read()
21 print(data)
22 f.close()
23 
24 #输出结果,在.py同目录内自动生成名为db2的文件
25 tom

示例:x 模式(只写模式,不可读;如果文件存在,报错;如果文件不存在,创建并写内容)

 1 # 1. 文件存在
 2 f = open("db", "x", encoding="utf-8")
 3 f.write("tom")
 4 f.close()
 5 
 6 # 输出结果,报错
 7 FileExistsError: [Errno 17] File exists: db
 8 
 9 # 2. 文件不存在
10 f = open("db3", "x", encoding="utf-8")
11 f.write("tom")
12 f.close()
13 
14 #执行结果:同目录下生成db3文件
15 
16 f = open("db3", "r", encoding="utf-8")
17 data = f.read()
18 print(data)
19 f.close()
20 
21 # 输出结果:db3内容
22 tom

示例:a 模式( 追加模式,可读;不存在则创建,存在只能追加内容)

 1 # 1. 文件存在
 2 f = open("db5", "a", encoding="utf-8")
 3 f.write("jarry \n")    #\n 写入文件内容自动换行
 4 f.close()
 5 
 6 f = open("db3", "r", encoding="utf-8")
 7 data = f.read()
 8 print(data)
 9 f.close()
10 
11 # 输出结果:
12 tom
13 jarry 

 

"b"表示以字节的方式操作

  • rb 或 r+b
  • wb 或 w+b
  • xb 或 x+b
  • ab 或 a+b

注:以b方式打开文件时,读取到的内容是字节类型,写入时也需要提供字节类型,且无需指定encoding字符编码

1 # 以字节方式指定字符编码,执行报错
2 f = open("db4", "r", encoding="utf-8")
3 data = f.read()
4 print(data,type(data))
5 f.close()
6 
7 #执行报错结果
8 ValueError: binary mode doesnt take an encoding argument

 示例:"b"表示以字节的方式操作

 1 # 1. 以字节形式wb模式写入数据,并输出写入结果
 2 f = open("db4", "wb")
 3 f.write(bytes(10))
 4 f.write(bytes("ab", encoding="utf-8"))    # 字符串指定编码格式,并转换成字节
 5 f.write(bytes("", encoding="utf-8"))    # 字符串指定编码格式,并转换成字节
 6 f.close()
 7 
 8 f = open("db4", "rb")  #以字节形式打开文件,如果不加b以字符形式打开文件
 9 data = f.read()
10 print(data, type(data))  #查看结果及数据类型
11 print()
12 f.close()
13 
14 # 输出结果
15 b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00ab\xe9\xbe\x99 <class bytes>  #bytes类型
16 
17 # 2. 以字节形式ab模式写入数据,并输出写入结果
18 f = open("db4", "ab")
19 f.write(bytes("厚德", encoding="utf-8"))
20 f.close()
21 
22 f = open("db4", "rb")
23 data = f.read()
24 print(data, type(data))
25 print()
26 f.close()
27 
28 # 输出结果
29 b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00a\xe9\xbe\x99\xe5\x8e\x9a\xe5\xbe\xb7 <class bytes>
30 
31 # 3. 以字节形式xb模式写入数据,并输出写入结果
32 f = open("db4", "xb")
33 f.write(bytes("载物", encoding="utf-8"))
34 f.close()
35 
36 # 输出结果
37     f = open("db4", "xb")
38 FileExistsError: [Errno 17] File exists: db4

 

"+"表示可以同时读写某个文件

  • r+, 读写【可读,可写】
  • w+,写读【可读,可写】
  • x+ ,写读【可读,可写】
  • a+, 写读【可读,可写】

示例:

 1 # r+模式
 2 f = open("db5", "r+", encoding="utf-8")
 3 f.write("testr")
 4 f.close()
 5 
 6 f = open("db5", "r", encoding="utf-8")
 7 data = f.read()
 8 print(data, type(data))
 9 f.close()
10 
11 # 输出结果
12 testr <class str>
13 
14 
15 # w+模式
16 f = open("db5", "w+", encoding="utf-8")
17 f.write("testw")
18 f.close()
19 
20 f = open("db5", "r", encoding="utf-8")
21 data = f.read()
22 print(data, type(data))
23 f.close()
24 
25 # 输出结果,清空原文件内容
26 testw <class str>
27 
28 
29 # a+模式
30 f = open("db5", "a+", encoding="utf-8")
31 f.write("testa")
32 f.close()
33 
34 f = open("db5", "r", encoding="utf-8")
35 data = f.read()
36 print(data, type(data))
37 f.close()
38 
39 #输出结果,追加内容
40 testwtesta <class str>

 

打开文件操作小结:

  1. 非字节类型,一般指定字符编码为utf-8。
  2. 模式中有b,按字节形式操作;模式中无b,按字符形式操作。
  3. 字节形式输入字符,字符需要指定编码格式,并转换成字节。

 

2、操作文件

常用操作文件

fileno()   #文件描述符
flush()    #刷新文件内部缓冲区
isatty()   #判断文件是否是tty设备
read()    #读取数据,有b按字节;无b按字符
readable()  #是否可读
readline()  #仅读取一行数据
seek()     #指定文件中指针位置
seekable()  #指针是否可操作
tell()    #获取指针位置
truncate()  #截断数据,指针位置后的数据清空
writable()  #是否可写
write()   #写内容

 示例

# db5文件内容
alex tom eric jarry
 
# 以utf-8格式,以r+读写模式打开db5文件
f = open("db5", "r+", encoding="utf-8")   
 
# readable(),查看文件是否可读
data1 = f.readable()
print("readable():", data1, type(data1))
# 输出结果
# readable(): True <class ‘bool‘>
# read(): ale tom eric jarry <class ‘str‘>
 
# read(),读取文件内容
data2 = f.read()
print("read():", data2, type(data2))
# 输出结果
# read(): ale tom eric jarry <class ‘str‘>
 
# fileno(),文件描述符
data3 = f.fileno()
print("fileno():", data3, type(data3))
# 输出结果
# fileno(): 3 <class ‘int‘>
 
# isatty(),判断文件是否为tty设备
data4 = f.isatty()
print("isatty():", data4, type(data4))
# 输出结果
# isatty(): False <class ‘bool‘>
 
# tell(),当前指针所在位置
data5 = f.tell()
print("tell():", data5, type(data5))
data2 = f.read()
print("read():", data2, type(data2))
data5 = f.tell()
print("tell():", data5, type(data5))
# 输出结果
# tell(): 0 <class ‘int‘>  #指针初始位置为0
# read(): alex tom eric jarry <class ‘str‘>  #读取所有数据
# tell(): 19 <class ‘int‘>  #指针位置到数据结尾
 
# seekable(),指针是否可操作
data6 = f.seekable()
print("seekable:", data6, type(data6))
# 输出结果
# seekable: True <class ‘bool‘>
 
# seek(),指定指针位置
data7 = f.seek(3)
print("seek:", data7, type(data7))
data5 = f.tell()
print("tell():", data5, type(data5))
# 输出结果
# seek: 3 <class ‘int‘>
# tell(): 3 <class ‘int‘>
 
# write(),写入数据,如果指定指针位置,写入数据时从指针位置开始向后覆盖
f.write("long")
# 输出结果,db5文件变化
# alelongm eric jarry
 
# writable(),文件是否可写入
data8 = f.writable()
print("writeable():", data8, type(data8))
# 输出结果
# writeable(): True <class ‘bool‘>

# truncate(),截取数据,指针位置后的数据清空
f.truncate(f.seek(3))
#close(),关闭文件
f.close()
# 输出结果,db5指针位3后数据全部清空
# ale

#close(),关闭文件
f.close()
 
 
 
# readline(),每次读取一行数据
f = open("db6", "w+", encoding="utf-8")
f.write("alex\n") #模拟多行数据环境
f.write("tom\n")
f.write("jarry\n")
f.write("eric\n")
f.close()
 
f = open("db6", "r+", encoding="utf-8")
data = f.readline() #每次读取一行
print("readline():", data, type(data))
data = f.readline()
print("readline():", data, type(data))
data = f.readline()
print("readline():", data, type(data))
f.close()
# 输出结果
# readline(): alex
#   <class ‘str‘>
# readline(): tom
#   <class ‘str‘>
# readline(): jarry
#   <class ‘str‘>
 
# flush(),刷新内部缓存数据到文件
f = open("db7", "w+", encoding="utf-8")
f.write("tom")
#如果不加入f.flush(),上面操作无法执行,缓存区数据不能写入文件,需要等待全部操作完成后执行
f.flush()
input("your name:")
f.close()

 

 扩展1:for循环对象f = open(xxx)

f = open("db7", ‘r+‘, encoding="utf-8")
for line in f:
    print(line,type(line))
f.close()
# 输出结果
# alex
#  <class ‘str‘>
# tom
#  <class ‘str‘>
# jarry
#  <class ‘str‘>
# eric <class ‘str‘>

 

 扩展2:同时打开两个文件

#示例格式
with open(‘db1‘) as f1, open("db2") as f2:
pass

#da1读取一行数据,db2写入一行数据
with open(‘db1‘, ‘r‘, encoding="utf-8") as f1, open("db2", ‘w‘,encoding="utf-8") as f2:
for line in f1:
new_str = line.replace("alex", ‘st‘)
f2.write(new_str)

 

3、关闭文件

f.close()

with方式打开一个文件

with open(‘xb‘) as f:
     pass

 

03_文件操作

标签:

原文地址:http://www.cnblogs.com/liangdalong/p/5521688.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!