python文件的操作

1.打开文件的基本结构

1.打开文件
f = open('d:\\1.txt',mode='r',encoding='gbk')
参数说明:
f为文件句柄,f可命名为变量f_obj,f_handler,f_h,fh,文件句柄。
open为python的内置系统函数
open(参数1,参数2,参数3)
参数一:为文件路径+文件,如果文件中出现\反斜杠经常会报路径错误
解决办法有两种:一个是在再加入一个反斜杠,\\将反斜杠转义
第二种:在路径前加入一个r字符
参数二:采用哪种模式打开:读r,写w,读写rw,写读wr,追加等、
如果是读r模式可以将该参数省略,默认为读模式
参数三:编码模式(gbk,utf-8,gb21312等),如果编码模式不正确,则会报错
2.读取文件句柄
data =f.read() 在内存中读取

3.关闭文件句柄
f.close() 读取完文件必须将文件在内存中关闭

2. 打开文件的模式有(默认为文本模式):
r ,只读模式【默认模式,文件必须存在,不存在则抛出异常】
w,只写模式【不可读;不存在则创建;存在则清空内容】
a, 只追加写模式【不可读;不存在则创建;存在则只追加内容】

2. 对于非文本文件,我们只能使用b模式,"b"表示以字节的方式操作(而所有文件也都是以字节的形式存储的,使用这种模式无需考虑文本文件的字符编码、图片文件的jgp格式、视频文件的avi格式)
rb
wb
ab
注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码

3,‘+’模式(就是增加了一个功能)
r+, 读写【可读,可写】
w+,写读【可写,可读】
a+, 写读【可写,可读】

4,以bytes类型操作的读写,写读,写读模式
r+b, 读写【可读,可写】
w+b,写读【可写,可读】
a+b, 写读【可写,可读】
文件的读写追加常用方法:
读:
读的四种模式:
r ***** 读
rb *** 以bytes形式读
r+ ***** 读写
r+b 以bytes类型操作读写【可读,可写】
对于非文本文件,我们只能使用b模式,"b"表示以字节的方式操作(而所有文件也都是以字节的形式存储的,使用这种模式无需考虑文本文件的字符编码、图片文件的jgp格式、视频文件的avi格式)
文件的r读取的五种方法:
方法一:全部读取
f = open(r'd:\1.txt',mode='r',encoding='gbk')
data = f.read()     #如果read()括号中不加任何参数,则为将文件全部打开,如果文件过大,或内存不足,死机
print(data)
f.close()
方法二:按字节数读取
f = open(r'd:\1.txt',mode='r',encoding='gbk')
data = f.read(6)        #f.read(n) n的参数是读取几个字节
print(data)
f.close()
方法三:按行读取
f = open(r'd:\1.txt',mode='r',encoding='gbk')
data = f.readline(4500)     #只读取一行,()中的参数也是一字节打印
print(data)
f.close()
方式四:方法用于读取所有行(直到结束符 EOF)并返回列表,该列表可以由 Python 的 for... in ... 结构进行处理。
# 如果碰到结束符 EOF 则返回空字符串,读取大文件会比较占内存
f = open(r'd:\1.txt',encoding='gbk',mode='r')
data = f.readlines()
print(data)
f.close()

方式五:for循环输出每一行

f = open(r'd:\1.txt',mode='r',encoding='gbk')
for i in f:
print(i.strip())
f.close()
rb读模式:以bytes模式读取文件,这种方式是为了打开非文本文件(如图片,音频)
f = open(r'd:\表情.jpg',mode='rb')    #此时注意不需要写编码模式,因为全部以bytes方式打开
data =f.read()
print(data)
f.close()
r+ 读写:先读后追加
f = open(r'd:\1.txt',encoding='gbk',mode='r+')
data = f.read()
data1 = f.write('你好')   #返回字符串长度
f.close()
print(data)
print(data1)
读取的几种情况:
1.无论是read(5)还是readline()读取的位置在哪,都是在文件最后写入内容
f = open(r'd:\1.txt',encoding='gbk',mode='r+')
data = f.read(5)
f.write('line测试')
f.close()
print(data)
2.如果在r+模式下,不读直接写,会将源文件覆盖写入新内容
f = open(r'd:\1.txt',mode='r+',encoding='gbk')
f.write('不写只读,则直接从开头覆盖写入新内容')
f.close()
rb模式
以bytes字节方式读
f= open(r'd:\1.txt',mode='rb')
data=f.read()
f.close()
print(data)
r+b模式
#以bytes类型读写
f = open(r'd:\1.txt',mode='r+b')
data = f.read()
f.write(b'\\xb2\)
f.close()
print(data)
写:
没有文件,创建文件也要写。
有文件,先清空,后写入
w模式:写入模式1.清空源文件内容,写入新内容;2.如果文件不存在创建新文件然后写入内容
f = open(r'd:\2.txt',encoding='gbk',mode='w')
# data =f.read()       在w写入模式前后都不能加入读
f.write('写入的新内容')
f.close()
w+模式:写读模式:只要文件不在就创建新文件
f = open(r'd:\3.txt',encoding='gbk',mode='w+')
f.write('先写入,后读取') #先写入后读取,光标在最后,所以读取内容为空
f.seek(0)                   #可以通过调整光标来定向显示的内容
data=f.read()
print(data)
f.close()
wb模式:以bytes模式写
f = open(r'd:\表情.jpg',mode='rb')
content = f.read()
f1 =open(r'd:\写真1.jpg',mode='wb')
f1.write(content)
f.close()
f1.close()
常犯错误:写入编码格式encoding;2,两边必须是对等以bytes的rb读,rb写,否则后报错。
w+b模式:以bytes写读
追加:a
没有文件,创建文件也要写。
有文件,直接在文件的最后面追加。
f = open('文件操作3', encoding='utf-8',mode='a')
f.write('\n南方水土好。。。')
f.close()
ab  a+ a+b
其他方法:readale ,writable,seek
f = open('文件操作1',encoding='utf-8')
if f.writable():
    content = f.read()
    print(content)
f.close()
seek 调整光标到开始,seek(0)  调整光标到结尾seek(0,2) 
f = open('文件操作1',mode='rb')
print(f.read())
f.seek(6) # 按照字节去移动光标
content = f.read()
print(content)
f.close()
tell 告知光标的位置
f = open('文件操作1',encoding='utf-8')
f.seek(0,2) # 按照字节去移动光标
print(f.tell())
f.close()
truncate 要在writable模式下进行截取。
r+ a+ ..不能在w模式下使用,对原文件进行截取
f = open('文件操作1',encoding='utf-8',mode='r+')
print(f.truncate(6))
f.close()
1,主动关闭文件句柄
with open('文件操作2',encoding='utf-8') as f1:
    print(f1.read())
2,开启多个文件句柄。
with open('文件操作2',encoding='utf-8') as f1,\
        open('文件操作3',encoding='utf-8',mode='w') as f2:
    print(f1.read())
    f2.write('666666')
文件的改的操作
1,以读的模式打开原文件,产生一个文件句柄f1.
2,以写的模式创建一个新文件,产生一个文件句柄f2.
3,读取原文件内容,进行修改,并将修改后的写入新文件。
4,将原文件删除。
5,将新文件重命名成原文件。
# low版
import os
with open('alex的深度剖析', encoding='utf-8') as f1,\
    open('alex的深度解析.bak',encoding='utf-8',mode='w') as f2:
    old_content = f1.read()
    new_content = old_content.replace('alex','SB')
    f2.write(new_content)
os.remove('alex的深度剖析')
os.rename('alex的深度解析.bak', 'alex的深度剖析')
#高级版
import os
with open('alex的深度剖析', encoding='utf-8') as f1,\
    open('alex的深度解析.bak',encoding='utf-8',mode='w') as f2:
    for line in f1:
        new_line = line.replace('SB','alex')
        f2.write(new_line)
os.remove('alex的深度剖析')    #移除路径+文件名
os.rename('alex的深度解析.bak', 'alex的深度剖析')   #rename(old文件名,新文件名)
View Code

 





posted @ 2018-08-21 21:06  麒麟610  阅读(168)  评论(0编辑  收藏  举报