Python之文件操作

一,文件操作基本流程

计算机系统分为:计算机硬件,操作系统,应用程序三部分。

我们用python或其他语言编写的应用程序若想要把数据永久保存下来,必须要保存于硬盘中,这就涉及到应用程序要操作硬件,众所周知,应用程序是无法直接操作硬件的,这就用到了操作系统。操作系统把复杂的硬件操作封装成简单的接口给用户/应用程序使用,其中文件就是操作系统提供给应用程序来操作硬盘虚拟概念,用户或应用程序通过操作文件,可以将自己的数据永久保存下来。

有了文件的概念,我们无需再去考虑操作硬盘的细节,只需要关注操作文件的流程:

#1. 打开文件,得到文件句柄并赋值给一个变量
f=open('a.txt','r',encoding='utf-8') #默认打开模式就为r

#2. 通过句柄对文件进行操作
data=f.read()

#3. 关闭文件
f.close()

 可能出现的错误:

1.UnicodeDecodeError:文件存储和打开的方式不一样

2:路径中含有\t,\n时需要在路径之前添加r或者用\\转义

二,文件编码

f=open(...)是由操作系统打开文件,那么如果我们没有为open指定编码,那么打开文件的默认编码很明显是操作系统说了算了,操作系统会用自己的默认编码去打开文件,在windows下是gbk,在linux下是utf-8

#这就用到了字符编码的知识:若要保证不乱码,文件以什么方式存的,就要以什么方式打开。
f=open('a.txt','r',encoding='utf-8')

三,文件的打开模式

文件句柄 = open(‘文件路径’,‘模式’)

E:\\new.txt 绝对路径
相对路径:同一个文件夹下的文件就是相对路径

r ,只读模式【默认模式,文件必须存在,不存在则抛出异常】

rb,一般用在非文字类型的文件:图片,视频  

  文件的下载和上传的功能用b模式

r+,读写(先读,后写 ) r+b

 

f = open('e:\新建文本文档.txt','r+',encoding = 'utf-8')
print(f.read())
f.write('asdadd')
f.close()

五种读取模式:

1、f.read() 全部读出来

f = open('log',mode='r',encoding='utf-8')
content = f.read(3) # r 模式:n 是按照字符读取
print(content)
f.close()
f = open('log',mode='rb')
content = f.read(5) # rb 模式:n 是按照字节读取
print(content)
f.close()
# bytes ---> str
s = b'\xe4\xb8\xb0\xe5\x8e'.decode('utf-8')
print(s)

 

2、f.readline() 按行读

f = open('log',encoding='utf-8')
line = f.readline()
print(line)
line1 = f.readline()
print(line1)
f.close()

 

3、f.readlines() 每一行作为一个元素放在列表中

f = open('log',encoding='utf-8')
lines = f.readlines()
print(lines)
f.close()

 

4、 推荐方式:循环读取

f = open('log',encoding='utf-8')
for i in f:
    print(i)
f.close()

 

5、f.read(n)

r模式按照字符的数目读取

rb模式按照字节的数目读取

f = open('e:\新建文本文档.txt','r',encoding = 'gbk')
content = f.read(3)
print(content)
f.close()

补充:bytes-->str  一个汉字3个字节,4,5个会报错

s = b'\xe4\xb8\xb0.decode(''utf - 8')  print(s)  #丰

 

f.write('laozhang')  若果没有文件,则创建文件写内容,如果有文件则将原文件删除,再写。

f = open('log','w',encoding='utf-8')
f.write('laozhang是sb')
f.close()
f = open('log1','w',encoding='utf-8')
f.write('laozhang依然是sb')
f.close()

 

wb模式  需要将写入的字符串.encode转换成二进制,并添加编码

写读w+  先写后读,f.seek(0)光标移动到开头

f = open('log1','wb')
f.write('laozhang依然是sb'.encode('utf-8'))
f.close()

 

追加

只追加 a ab

f = open('e:\新建文本文档.txt','a',encoding = 'gbk')
f.write('3')
f.close()

 

断点续传用到了tell和seek,都是按照字节去调整光标位置。

.truncate截取,按照字节去截取。

with open('log','r',encoding = 'utf-8') as f1:

  print(f1.read())

方法汇总:

def close(self, *args, **kwargs): # real signature unknown
        关闭文件
        pass

    def fileno(self, *args, **kwargs): # real signature unknown
        文件描述符  
        pass

    def flush(self, *args, **kwargs): # real signature unknown
        刷新文件内部缓冲区
        pass

    def isatty(self, *args, **kwargs): # real signature unknown
        判断文件是否是同意tty设备
        pass

    def read(self, *args, **kwargs): # real signature unknown
        读取指定字节数据
        pass

    def readable(self, *args, **kwargs): # real signature unknown
        是否可读
        pass

    def readline(self, *args, **kwargs): # real signature unknown
        仅读取一行数据
        pass

    def seek(self, *args, **kwargs): # real signature unknown
        指定文件中指针位置
        pass

    def seekable(self, *args, **kwargs): # real signature unknown
        指针是否可操作
        pass

    def tell(self, *args, **kwargs): # real signature unknown
        获取指针位置
        pass

    def truncate(self, *args, **kwargs): # real signature unknown
        截断数据,仅保留指定之前数据
        pass

    def writable(self, *args, **kwargs): # real signature unknown
        是否可写
        pass

    def write(self, *args, **kwargs): # real signature unknown
        写内容
        pass

常用方法:

read  readable readline readlines for循环

seek tell write writeable

 

 改动文件:

# 1,创建一个新文件.
# 2,读取原文件.
import os
with open('log',encoding='utf-8') as f1,\
    open('log.bak','w',encoding='utf-8') as f2:
    # 3,将原文件的内容通过你想要的方式进行更改,并写入新文件件.
    old_content = f1.read()
    new_content = old_content.replace('alex','SB')
    f2.write(new_content)
#4,将原文件删除.
os.remove('log')
#5,将新文件重命名原文件名.
os.rename('log.bak','log')

 

posted @ 2018-01-30 19:30  熊猫的黑白照  阅读(239)  评论(0编辑  收藏  举报