python之文件操作

文件操作
文件路径:d:\a.txt
编码方式:utf-8,gbk,GB2312....
操作方式:只读,只写,写读,读写,追加 等。
报错原因:
UnicodeDecodeError: 'gb2312' codec can't decode byte 0xa6 in position 2: illegal multibyte sequence:
  编码不一致,存储文件时编码与打开文件时编码不一致。
路径问题:
1,在路径的最前面加转义字符r:r'd:\a.txt'
2,把每个\ 变成 \\ :'d:\\a.txt'
绝对路径: d:\a.txt 从根目录开始找
相对路径: 从当前目录,当前文件夹开始找。

f = open(r'd:\a.txt',encoding='utf-8',mode='r')
content = f.read()
print(content)
f.close()

'''
f:文件句柄,可以理解为变量。
open():python的内置函数(内部调用的是windows的系统命令)

文件操作的三部曲:
1,打开文件,产生文件句柄。
2,对文件句柄进行操作。
3,关闭文件句柄。
'''


文件打开模式:
1. 打开文件的模式有(默认为文本模式):
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 *****(五小种方式)
  read() ***
  read(n)
  readline()
  readlines()

  for 循环 *****
rb ***
r+ *****
r+b:



mode可以不写,默认为r模式。
read(3):
  1. 文件打开方式为文本模式时(r),代表读取3个字符
  2. 文件打开方式为b模式时(rb),代表读取3个字节
其余的文件内光标移动都是以字节为单位的如:seek,tell,truncate

具体实例:
1、r:只读模式[默认模式,文件必须存在,不存在则抛出异常]

 

复制代码
# 1,read 全部读取
f = open('文件操作1',encoding='utf-8',mode='r')
content = f.read() 
print(content)
f.close()

# 2,read(n):按照字符读取
f = open('文件操作1',encoding='utf-8',mode='r')
content = f.read(10) #r模式,按照字符读取(注意,文本的换行符虽然默认不显示,但是也是一个字符)。
print(content)
f.close()

# 3, readline 按行读取
f = open('文件操作1',encoding='utf-8',mode='r')
print(f.readline()) #读取第一行
print(f.readline()) #读取第二行...
f.close()

# 4,readlines 按行全部读取,返回一个list
f = open('文件操作1',encoding='utf-8',mode='r')
content = f.readlines()
print(content)
f.close()

# 5,for循环。一行一行输出
f = open('文件操作1',encoding='utf-8',mode='r')
for line in f:
    print(line.strip())
f.close()
复制代码

 

 

 

2、rb

复制代码
f = open('美女1.jpg', mode='rb')
content = f.read()
print(content)
f.close()

f = open('文件操作1', mode='rb')
content = f.read(9)  # rb模式 n 按照字节读取。
print(content)
f.close()
复制代码

 

3、r+(读写):先读后追加。

复制代码
f = open('文件操作1',encoding='utf-8',mode='r+')
content = f.read()
print(content)
f.write('666')
f.close()

f = open('文件操作1',encoding='utf-8',mode='r+')
content = f.read(3) #r+模式 n按字符读取
print(content)
f.write('666')
f.close()

# 不读直接写:直接从开始覆盖
f = open('文件操作1',encoding='utf-8',mode='r+')
f.write('深圳你好')
f.close()
复制代码

 



二、 写
w ***
wb **
w+
w+b
具体实例:
1、w
没有文件,创建文件也要写。
有文件,先清空,后写入。

f = open('文件操作2', encoding='utf-8',mode='w')
f.write('深圳市南山区,福田区,罗湖区。。。')
f.close()

 

2、wb

复制代码
f = open('美女1.jpg',mode='rb')
content = f.read()
print(content)

f1 = open(' 美女2.jpg',mode='wb')
f1.write(content)
f.close()
f1.close()
复制代码

 

3、w+: 写读

复制代码
f = open('文件操作2', encoding='utf-8',mode='w+')
f.write('深圳市南山区,福田区,罗湖区。。。')
f.seek(3) # 调整光标
content = f.read()
print(content)
f.close()
复制代码

 


三、 追加
a ***
ab
a+
a+b


a:
没有文件,创建文件也要写。
有文件,直接在文件的最后面追加。

f = open('文件操作3', encoding='utf-8',mode='a')
f.write('\n南方水土好。。。')
f.close()

 



四、 文件操作的其他方法
read() *****
write() *****
close() *****
seek() *****
tell() *****
readable() ****
writable() **** 判断是否可写
truncate() **



具体实例:
其他方法:readable ,writable,seek

 

复制代码
f = open('文件操作1',encoding='utf-8') #不写mode,默认是r
if f.writable(): #判断是否可写
    content = f.read()
print(content)
f.close()

# seek:调整光标到开始seek(0) 调整光标到结尾seek(0,2)。0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起。
f = open('文件操作1',encoding='utf-8')
f.seek(6) # 按照字节去移动光标
content = f.read()
print(content)
f.close()

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模式下进行截取(可以在w使用,但是不推荐在w模式下使用)。
# 可在r+  a+  等使用,表示对原文件进行截取
# 指定长度的话,就从文件的开头开始截断指定长度,其余内容删除;
# 不指定长度的话,就从文件开头开始截断到当前位置,其余内容删除。
f = open('文件操作1',encoding='utf-8',mode='r+')
print(f.truncate(6)) #以字节截取
f.close()

# with open:过一段时间自动关闭文件
# 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,将新文件重命名成原文件。

复制代码
# 方式一:将硬盘存放的该文件的内容全部加载到内存,在内存中是可以修改的,修改完毕后,再由内存覆盖到硬盘(word,vim,nodpad++等编辑器)
# low版:
import os
with open('小白的深度剖析', encoding='utf-8') as f1,\
open('小白的深度解析.bak',encoding='utf-8',mode='w') as f2:
    old_content = f1.read()
    new_content = old_content.replace('小白','SB')
    f2.write(new_content)
os.remove('小白的深度剖析')
os.rename('小白的深度解析.bak', '小白的深度剖析')

# 方式二:将硬盘存放的该文件的内容一行一行地读入内存,修改完毕就写入新文件,最后用新文件覆盖源文件
# 升级版:
import os
with open('小白的深度剖析', encoding='utf-8') as f1,\
open('小白的深度解析.bak',encoding='utf-8',mode='w') as f2:
    for line in f1:
        new_line = line.replace('小白','SB')
        f2.write(new_line)
os.remove('小白的深度剖析')
os.rename('小白的深度解析.bak', '小白的深度剖析')
复制代码

 

posted @ 2018-12-09 17:51  从入门到出师  阅读(151)  评论(0编辑  收藏  举报