Python----文件的IO操作

 

一、文件操作

r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。
r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
w 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
w+ 打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

  打开文件

  假设我们有一个file.txt文件,内容为:

abcdefg
jijklmn
opqtsr
uvwxyz
# Author:Tim Gu
data = open('file.txt',encoding="utf-8").read()
print(data)

输出:

abcdefg
jijklmn
opqtsr
uvwxyz

  读文件:

# Author:Tim Gu
f = open('file.txt','r',encoding='utf-8')
data = f.read()
print(data)
>>>
abcdefg
jijklmn
opqtsr
uvwxyz

  写文件:

f = open('file.txt2','w',encoding='utf-8') #文件句柄,使用w时事实上是创建了一个新文件,如果源文件存在,会覆盖
f.write("I will go home!") 
f.write('\nByeBye!')
f.write('\nadfas')

 

  追加文件:

  

f = open('file.txt2','a',encoding='utf-8') #文件句柄
f.write("See you,tomorrow!")

  打开文件file.txt2

I will go home!
ByeBye!
adfasSee you,tomorrow!

  以行读取文件:
# Author:Tim Gu
f = open('file.txt2','r',encoding='utf-8') #文件句柄
print(f.readline())  #读取一行
for i in range(2):   #使用for循环读取2行
    print(f.readline()) 

  使用readline()读取的是文件的单行,readlines()会读取文件全部行,每行作为一个元素形成一个列表。readlines()因为会一下子把文件全部读取到内存,所以只适合读小文件。

  下面示例读取文件,但不读取第10行:

# Author:Tim Gu
f = open('file3.txt','r',encoding='utf-8') #文件句柄
#print(f.readlines())
for index,line in enumerate(f.readlines()): #使用遍历读取文件
    if index == 9:
        print('------------------我是分割线-------------------')
        continue
    print(line.strip())

  输出:

从前现在过去了再不来
红红落叶长埋尘土内
开始终结总是没变改
天边的你飘泊白云外
苦海翻起爱恨
在世间难逃避命运
相亲竟不可接近
或我应该相信是缘份
情人别后永远再不来(消散的情缘)
------------------我是分割线-------------------
鲜花虽会凋谢(只愿)
但会再开(为你)
一生所爱隐约(守候)
在白云外(期待)
苦海翻起爱恨
在世间难逃避命运
相亲竟不可接近
或我应该相信是缘份
苦海翻起爱恨
在世间难逃避命运
相亲竟不可接近
或我应该相信是缘份

 

  处理大文件的方法:这行代码的效果和上面的一样,只是使用了迭代器,使得内存可以只保留一行

f = open('file3.txt','r',encoding='utf-8') #文件句柄
count = 0
for line in f: #一行行读取文件,内存中只保留一行。
    if count == 9:
        print('------------我是分割线---------------')
        count += 1
        continue
    else:
        print(line.strip())
        count += 1

 

  光标处理:seek()用法

# Author:Tim Gu
f = open('file3.txt','r',encoding='utf-8') #文件句柄
print(f.tell()) #读取光标坐在位置
print(f.readline()) #读取一行
print(f.readline()) #读取第二行
print(f.readline()) #读取第三行
print(f.tell()) #打印光标所在位置
f.seek(0) #使光标回到原点
print(f.tell()) #打印光标位置
>>>
0
从前现在过去了再不来

红红落叶长埋尘土内

开始终结总是没变改

90
0

  flush()实时将数据写入磁盘

  打印进度条的小方法: 

# Author:Tim Gu
import sys,time
for i in range(20):
    sys.stdout.write("#")  #sys.stdout方法在同一行打印
    sys.stdout.flush()      #每打印一个#符号写入一次
    time.sleep(0.3)         #每打印一次隔0.3秒
>>>
####################

  

  truncate() 截断文件,可以清空文件

# Author:Tim Gu
f = open('file.txt','a',encoding='utf-8')
f.truncate(10)  #保留文件前10个字符,其余截断

  

  文件的模式:r+读写模式:这段代码会先读取3行,然后再在文件最后写入"-------------------------------------"

# Author:Tim Gu
f = open('file.txt','r+',encoding='utf-8') #读写
print(f.readline())
print(f.readline())
print(f.readline())
f.write("----------------------------------------------")
print(f.readline())

  文件的模式:w+ 写读模式:会创建新文件,此段代码会覆盖掉源文件

# Author:Tim Gu
f = open('file.txt','w+',encoding='utf-8') #写读
print(f.readline())
print(f.readline())
print(f.readline())
f.write("----------------------------------------------")
print(f.readline())


 

  tell()和seek()联合使用:

# Author:Tim Gu
f = open('file.txt','w+',encoding='utf-8') #写读
f.write("-----------------------------1------------------------")
f.write("\n-----------------------------2------------------------")
f.write("\n-----------------------------3------------------------")
f.write("\n-----------------------------4------------------------")
print(f.tell()) #打印光标所在位置
f.seek(10)   #使光标回到第十个字符的位置
print(f.readline())   #打印当前行
>>>
222
-------------------1------------------------

此时文件内容:

-----------------------------1------------------------
-----------------------------2------------------------
-----------------------------3------------------------
-----------------------------4------------------------should be at the begining of the second line

 

  line.replace的用法,修改文件中的某一行内容:

# Author:Tim Gu
f = open('file3.txt','r',encoding='utf-8')
f_new = open('file3.bak','w',encoding='utf-8')
for line in f:
    if '天边的你飘泊白云外' in line:
        line = line.replace('天边的你飘泊白云外','aaaaaaaaa')  #修改这一行字符串
    f_new.write(line)
f.close()
f_new.close()

 

   使用with打开文件:

with open('file.txt','r',encoding='utf-8') as f,\
        open('file3.txt','r',encoding='utf-8') as f2:
    for line in f:
        print(line)
    for line in f2:
        print(line)

 

  注:因实际开发过程中,打开文件很容易忘记关闭文件,造成内存不能释放,所以一般可以选择使用with open方法打开文件

  
  python3的新特性:x

f = open('1.txt','x',encoding='utf-8') #如果文件存在则报错,不存在则创建文件并只写

 

  文件之ab模式:

f = open('1.txt','ab') #使用ab写文件
f.write(bytes('顾卿',encoding='utf-8')) #因为有b,所以必须传字节类型,所以使用bytes把字符串转化为字节类型
f.close()

 

  seek()和tell()的特性:
模式r+一般比较常用,相比较a+,r+可控制指针位置来写,而a+则永远只能在末尾写 

f = open('1.txt','r+',encoding='utf-8') #打开模式是r+(无b),读取按照字符读取
data = f.read(1) 
print(f.tell()) #tell当前指针所在的位置(字节)
f.seek(f.tell()) #调整当前指针的位置(字节)
f.write('888') #当前位置开始覆盖
f.close()

  

  flush()的作用:

f = open('1.txt','a',encoding='utf-8')
f.write('123')
f.flush()  #将缓存内容强制写进磁盘
input('asdfasd')

 

  seekable():
是否可以移动指针

 

打开两个文件,将第一个文件的内容写进第二个文件:

  

with open('1.txt','r',encoding='utf-8') as f1,open('2.txt','w',encoding='utf-8') as f2:
    times = 0
    for line in f1:
        times += 1
        if times <= 10:
            f2.write(line)
        else:
            break
            
读取第一个文件内容,修改后写入第二个文件:
with open('1.txt','r',encoding='utf-8') as f1,open('2.txt','w',encoding='utf-8') as f2:
    times = 0
    for line in f1:
        new_str = line.replace('aaaaa','st')
        f2.write(new_str)

 

posted @ 2016-11-22 20:21  Tim_Gu  阅读(...)  评论(... 编辑 收藏