文件操作

我是研究僧i 提交于 2020-04-04 00:41:53

绝对路径:盘符开头并精确到目标文件,例如:f:\试用\实验.txt

相对路径:当前目录下的文件,例如:实验.txt

文件操作

ps:操作完成后一定要结束操作,使用s.close,避免持续占用内存空间。

open()     open(“绝对路径或相对路径”,“模式”,“编码格式”)

r——只读:只是读取文件,不作任何更改。

s = open("f:\试用\实验.txt",mode="r",encoding="utf-8")
q = s.read()
print(q)
s.close()

w——只写:若没有文件就创建文件,然后写入;若已有,那便清空内容重新写入。

s = open("f:\试用\实验.txt",mode="w",encoding="utf-8")
s.write("你好世界")
s.close()

a——追加:在已有的文件的内容后面追加新的内容。

s = open("f:\试用\实验.txt",mode="a",encoding="utf-8")
s.write("你好世界")
s.close()

 

操作非文字(图片,视频或其他)类型的文件时用bytes

rb——用byte数据类型读取文件

s = open("f:\试用\实验.txt",mode="rb")
content = s.read()
print(content)    #输出的内容按byte类型输出,b’字母还是字母,中文用十六进制表示
s.close()

wb——用byte数据类型写入文件

s = open("f:\试用\实验.txt",mode="wb")
s.write("你好世界".encode("utf-8"))  #byte数据类型使用除了Unicode之外的数据类型进行储存
s.close()

ab——用byte数据类型追加写入

s = open("f:\试用\实验.txt",mode="ab")
s.write("你好世界".encode("utf-8"))
s.close()

双功能:

r+——读写,先读取文件,然后在文件内容后追加新的内容

s = open("f:\试用\实验.txt",mode="r+",encoding="utf-8")
print(s.read())
s.write("阿瑞斯")   #在r+模式下,此步骤可不写,运行程序后会表现为只读,不会报错
s.close()

如果在r+的模式下,先进行写然后再读取(将上面的中间两行代码互换)运行结果就会成为:输入n个字符就会从头开始覆盖原内容的n个字符(不是插入,也不是一次性删除所有内容然后写入)而读取的是未覆盖的内容,若新的字符将原字符完全覆盖,那么读取内容为空。

w+——写读,先将原内容清空,然后写入,并且毛都不会读出来,因为之前的操作已经将光标移动到末尾了(不常用)

用调光标【s.seek(0)括号内为字符索引,若为0便是将光标移到开头】的方法可以读取(详见a+的使用方法的演示代码)

s = open("f:\试用\实验.txt",mode="w+",encoding="utf-8")
s.write("你好世界,nihaoma")
print(s.read())
s.close()

a+——追加读取,先在原有的内容上追加新的内容,然后再读取,毛都读不出来,原因同上,解决方法同上

s = open("f:\试用\实验.txt",mode="a+",encoding="utf-8")
s.write("你好世界")
s.seek(0)   #将光标移动到内容开头
print(s.read())
s.close()

操作非文字(图片,视频或其他)类型的文件时用bytes

r+b :使用bytes类型读写 ;w+b;使用bytes类型写读   a+b :使用bytes类型追加读取;

 

操作方法详解

read():读取,读取出来的都是字符,在括号内设定数字几,就可以设定读取多少字符。例如read(3)便是读取文件内容的3个字符

seek():定光标,按字节,括号内设定多少就是将光标定到那个字节的后面,例如Python3的字符是用Unicode进行储存的,每3个字节代表一个中文字符,若s.seek(3),那么光标将会定到文件内容的第一个中文字符的后面(不同的编码方式,每种字符的字节各不相同,使用前先看好)

tell():输出光标的位置

readable():是否可读(返回布尔值True、False)

readline():一行一行读

readlines():输出为列表,每一行当成列表中的一个元素,添加到列表中

truncate():对原文件进行截取,括号内若为5,那便截取原文件的前5个字符,其余清空。

想打印文件内容可以用for循环:先用open打开文件,然后循环变量(尽量别用这种方式,尤其是在不知道这个文件有多大时;尽量一行一行读)

为了避免忘记写close关闭文件,使其持续占用内存   或  想要一次性用不同的操作模式(mode)打开多个文件可以使用:

原代码:s = open(路径,mode,encoding)

with    open(路径,mode,encoding)     as     变量名(s)      #文件操作完成后自动关闭 

with    open(路径,mode,encoding)     as     变量名(s) ,with    open(路径,mode,encoding)     as     变量名(f)    #打开多个文件,有缩进

 

其他方法见:http://www.cnblogs.com/jin-xin/articles/8183203.html

文件的修改:

文件的数据是存放于硬盘上的,因而只存在覆盖、不存在修改这么一说,我们平时看到的修改文件,都是模拟出来的效果,具体的说有两种实现方式:

方式一:将硬盘存放的该文件的内容全部加载到内存,在内存中是可以修改的,修改完毕后,再由内存覆盖到硬盘(word,vim,nodpad++等编辑器)

方法一import os  # 调用系统模块

with open('a.txt') as read_f,open('.a.txt.swap','w') as write_f:
    data=read_f.read() #全部读入内存,如果文件很大,会很卡
    data=data.replace('alex','SB') #在内存中完成修改

    write_f.write(data) #一次性写入新文件

os.remove('a.txt')  #删除原文件
os.rename('.a.txt.swap','a.txt')   #将新建的文件重命名为原文件

方式二:将硬盘存放的该文件的内容一行一行地读入内存,修改完毕就写入新文件,最后用新文件覆盖源文件

 

import os

with open('a.txt') as read_f,open('.a.txt.swap','w') as write_f:
    for line in read_f:
        line=line.replace('alex','SB')
        write_f.write(line)

os.remove('a.txt')
os.rename('.a.txt.swap','a.txt') 

方法二

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!