Python文件操作
- 一、关于文件
- 二、读写文件简单操作
- 三、文件权限
- 四、文件高级操作
- 五、大文件的读取
-
- 基本方法
- 常用函数
- 六、大文件的读取其他方式
一、关于文件
- 文件的作用:把一些数据储存起来
- 使用文件流程:
- 打开文件,读写文件,关闭文件
二、读写文件简单操作
-
1.读取文件
#打开文件 file = open("demo1/1.txt",mode="r") #读取文件 ret = file.read() #file只是变量,read是读取函数 print(ret) #关闭文件 file.close() #第一个参数的文件的路径 #第二个参数mode=访问文件的模型,r表示读,默认是r模式
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-
2.写入文件
2.写文件 write file = open("demo1/1.txt",mode="w") file = open("demo1/111.txt",mode="w") #文件不存在,会自动创建 file = open("demo2/111.txt",mode="w") #不会创建目录 file.write("huangzhi") file.close()
- 1
- 2
- 3
- 4
- 5
- 6
三、文件权限
-
rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。一般用于 非文本文件如图片等。
注意:二进制文件把内容表示为一个特殊的 bytes 字符串类型。# file = open("demo1/1.txt","rb") file = open("demo1/1.png","rb") ret = file.read() #b'huangzhi' huangzhi print(ret) file.close()
- 1
- 2
- 3
- 4
- 5
-
r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
file = open("demo1/1.txt","r+") # ret = file.read() #读取全部内容 # print(ret) file.write("guyin") #从头写入,原有内容会逐渐被覆盖 file.close()
- 1
- 2
- 3
- 4
- 5
-
rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于 非文本文件如图片等。
-
wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
from demo1.img import img2 file = open("demo1/2.jpg","wb") file.write(img2) file.close()
- 1
- 2
- 3
- 4
-
w+ 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即 原有内容会被删除。如果该文件不存在,创建新文件。
file = open("demo1/1.txt","w+") file.write("hello world") ret = file.read() print(ret) file.close()
- 1
- 2
- 3
- 4
- 5
-
a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。
也 就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件 进行写入。#在demo1下的111.txt中追加“guyin” # file = open("demo1/111.txt","a") file = open("demo1/3.txt","a") file.write("guyin") file.close()
- 1
- 2
- 3
- 4
- 5
-
ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文 件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在, 创建新文件进行写入。
-
a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。
文 件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。file = open("demo1/111.txt","a+") file.write("yangyong") ret = file.read() print(ret) file.close()
- 1
- 2
- 3
- 4
- 5
-
ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文 件的结尾。如果该文件不存在,创建新文件用于读写。
四、文件高级操作
-
调用 read()会一次性读取文件的全部内容,如果文件有 10G,内存就爆了,会导致程序卡死,
所以,要保险起见,可以反复调用 read(size)方法,每次最多读取 size 个字符的内容file = open("demo1/111.txt","r") ret1 = file.read(5) ret2 = file.read(5) # print(ret1) print(ret2) file.close()
- 1
- 2
- 3
- 4
- 5
- 6
-
readline 每次读取一行,并且自带换行功能 每一行末尾会读到\n可以指定每行读取的字符长度,下一次读取会从此位置开始
f = open("demo1/4.txt","r") # ret = f.read() print(f.readline(3)) print(f.readline(3)) print(f.readline(3)) f.close()
- 1
- 2
- 3
- 4
- 5
- 6
-
readlines,一次性以行的形式读取文件的所有内容并返回一个 list,需要去遍历读出来
f = open("demo1/4.txt","r") ret = f.readlines() # print(ret) for i in ret: print(i,end='') f.close()
- 1
- 2
- 3
- 4
- 5
- 6
-
file 句柄是一个可迭代的对象因此,可以循环读取文件中的内容,每次读一行
f = open("demo1/4.txt","r") # print(f) #文件句柄,是一个可迭代对象 for i in f: print(i) f.close()
- 1
- 2
- 3
- 4
- 5
-
write和writelines(多行一次性写入)
file = open("demo1/5.txt","w") # file.write("yangyong") # file.write("zhuzucheng") # lst = ["yangyong","zhuzucheng"] #列表中必须是字符串 lst = ["yangyong","zhuzucheng",10] # for i in lst: # file.write(i) file.writelines(lst) file.close()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
-
cvs文件读写
- 写入 CSV 文件 必须创建 csv 模块中对应的 writer 对象,通过 writer 对象完成文件内容的写入操作
f = open("demo1/movie.csv","w",newline='') writer = csv.writer(f) writer.writerow(["电影名称","评分","演员","网址"]) writer.writerows([["唐人际探案1","8.5","刘昊然","www.movei1.com"], ["唐人际探案2","8.6","刘昊然","www.movei2.com"], ["唐人际探案3","8.7","刘昊然","www.movei3.com"]]) f.close()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 读取 csv 文件的操作,主要通过 csv 模块中的 reader 对象来完成,通过加载文件数据到 reader 对象中,文件中的数据就会按照固定的格式读取到程序中进行处理
f = open("demo1/movie.csv","r",newline='') reader = csv.reader(f) # print(reader) #<_csv.reader object at 0x0000000001EACCE0> for i in reader: print(i) f.close()
- 1
- 2
- 3
- 4
- 5
- 6
将豆瓣电影写入csv文件:电影名称,评分,演员,网址
from demo1.movie import movie_dict2 print(movie_dict2) for i in movie_dict2["data"]: #遍历列表,取出字典对应的数据 print(i['title'],i['rate'],i['casts'],i['url']) f = open("demo1/movie2.csv","w",newline='') writer = csv.writer(f) writer.writerow(["电影名称","评分","演员","网址"]) for i in movie_dict2["data"]: movie_name = i['title'] rate = i['rate'] casts = i['casts'] url = i["url"] writer.writerow([movie_name,rate,casts,url]) f.close()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
五、大文件的读取
如果文件不是很大的话,这种做法能够保证读取的速度,但是如果文件内容很大,大到差不多内存那么大或者更大的时候,就不能这么做了。但是 Python 早就替你考虑到了,Python 中有一个 fileinput 模块,可以使用它来操作。
import fileinput
with fileinput.input(files='text.html') as f:
for line in f:
print(line,end="")
- 1
- 2
- 3
- 4
当出现如下错误:
UnicodeDecodeError: ‘gbk’ codec can’t decode byte 0x80 in position 1517: illegal multibyte sequence
可以说明其编码有问题,我们可以将其转换成utf8,具体措施如下:
import fileinput
with fileinput.input(files='text.html',openhook=fileinput.hook_encoded("utf8")) as f:
for line in f:
print(line,end="")
- 1
- 2
- 3
- 4
- 5
基本方法
fileinput.input(files=None, inplace=False, backup='', bufsize=0, mode='r', openhook=None)
- 1
files: #文件的路径列表,默认是stdin方式,多文件['1.txt','2.txt',...]
inplace: #是否将标准输出的结果写回文件,默认不取代
backup: #备份文件的扩展名,只指定扩展名,如.bak。如果该文件的备份文件已存在,则会自动覆盖。
bufsize: #缓冲区大小,默认为0,如果文件很大,可以修改此参数,一般默认即可
mode: #读写模式,默认为只读
openhook: #该钩子用于控制打开的所有文件,比如说编码方式等;
- 1
- 2
- 3
- 4
- 5
- 6
常用函数
fileinput.input() #返回能够用于for循环遍历的对象
fileinput.filename() #返回当前文件的名称
fileinput.lineno() #返回当前已经读取的行的数量(或者序号)
fileinput.filelineno() #返回当前读取的行的行号
fileinput.isfirstline() #检查当前行是否是文件的第一行
fileinput.isstdin() #判断最后一行是否从stdin中读取
fileinput.close() #关闭队列
- 1
- 2
- 3
- 4
- 5
- 6
- 7
六、大文件的读取其他方式
def get_lines():
with open('file.txt','rb') as f:
return f.readlines()
if name == ' main ':
for e in get_lines():
process(e) # 处理每一行数据
- 1
- 2
- 3
- 4
- 5
- 6
现在要处理一个大小为10G的文件,但是内存只有4G,如果在只修改get_lines 函数而其他代码保持不变的情况下,应该如何实现?需要考虑的问题都有那些?
def get_lines():
with open('file.txt','rb') as f:
for i in f:
yield i
- 1
- 2
- 3
- 4
个人认为:还是设置下每次返回的行数较好,否则读取次数太多。
def get_lines():
l = []
with open('file.txt','rb') as f:
data = f.readlines(60000)
l.append(data)
yield l
- 1
- 2
- 3
- 4
- 5
- 6
from mmap import mmap
def get_lines(fp):
with open(fp,"r+") as f:
m = mmap(f.fileno(), 0)
tmp = 0
for i, char in enumerate(m):
if char==b"\n":
yield m[tmp:i+1].decode()
tmp = i+1
if name ==" main ":
for i in get_lines("fp_some_huge_file"):
print(i)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
-
关注微信公众号【爱上开源】,该公众号会为你提供作者在网上找到有趣的开源项目,会将使用过程写成文章呈现给读者.公众号还提供爬虫和部分计算机资源给读者.如果读者想要什么资源可以私信给我,作者会尽力查询(不要涉嫌违法资源即可)