#11 文件操作
#文件操作基本流程
#1.打开文件,得到文件句柄并赋值给变量 f = open('')
#2.通过获得的句柄对文件进行操作 data = f.read()读文件
#3关闭文件 f.close()
#windows的文本文档默认的编码是ansi编码,直接打开会乱码
#文件打开模式
#'r' 默认的打开方式,只读
#'w' 打开写入,首先截断文件(若文件不空,首先清空文件)
#'x' 创建一个新文件,只写
#'a' 只写打开文件,如果文件不空追加到文件末尾
#'b' 二进制模式
#'t' 文本模式 也是默认的模式
#'+' 打开磁盘文件准备更新(读和写)
#'U' 通用换行模式(不建议使用)
#read()方法不一定能全读出来, 只做一次系统调用
#注意:python只能将字符串写入文件
#总结先写前头,如果想要字符数据并且观看内容使用r模式,如果不需要观看只需rb便可。
#在python3中对于seek()函数,所操作的文件必须是rb
f
=
open
(
'
test
'
,
encoding
=
'
utf8
'
)
data
= f.
read
()
#将文件内容直接加载到内存中
print
(data)
#只读n个字符
f.
seek
(
0
)
#文件指针指到行首
data
= f.
read
(
10
)
#读10个字节
print
(data)
#只读前五行
f.
seek
(
0
)
for i
in
range
(
5
):
print
(f.
readline
())
#以列表的方式读取整个文件,文件大内存容易出问题,慎用!!!!!!!!!!注意注意!!
f.
seek
(
0
)
print
(
"
以列表的方式读取整个文件
"
)
for line
in f.
readlines
():
print
(line)
f.
close
()
#读取一行
with
open
(
'
test
'
,
encoding
=
'
utf8
'
)
as f:
print
(f.
readline
())
#写入文件,参数为字符串
with
open
(
'
test
'
,
'
a+
'
,
encoding
=
'
utf8
'
)
as f:
f.
write
(
'
嗯! 你说的很对!!我同意
'
)
#写入文件,参数是序列,比如列表,元组等。
with
open
(
'
test
'
,
'
a+
'
,
encoding
=
'
utf8
'
)
as f:
f.
writelines
([
'
小子
'
,
'
你
'
,
'
真聪明!
'
])
#判断文件是否是这个Return whether this is an 'interactive' stream
with
open
(
'
test
'
,
'
r+
'
,
encoding
=
'
utf8
'
)
as f:
ret
= f.
isatty
()
read
= f.
readable
()
print
(
'
判断是否可读:
'
, read)
print
(ret)
#指定/指出文件中指针的位置
with
open
(
'
test
'
,
'
r
'
,
encoding
=
'
utf8
'
)
as f:
f.
read
(
15
)
print
(f.
tell
())
#指出文件指针的位置
f.
seek
(
20
)
print
(f.
tell
())
#指定文件指针
#截断文件数据,仅保留指定之前的数据(字节数)
with
open
(
'
test
'
,
'
r+
'
,
encoding
=
'
utf8
'
)
as f:
f.
truncate
(
0
)
#下面是一些更加详细的补充,以及关于上述概念的一些更加容易理解的解释,
#读者可以将代码分块,粘贴进visual studio code或者其他环境,进行分析
#文件操作
#文件读写过程操作类似于手动操作windows下文件过程
#首先打开文件,之后对文件进行读写,最后关闭文件。
#open()函数参数,文件名,操作模式,编码方式
#文件名 = 全路径(绝对路径或者相对路径 默认为当前路径)
#打开模式:
# w 只写模式打开,清空(不是覆盖) + 写 注:数据库操作慎用
# r 只读 文件不存在则报错
# a 在文件末尾追加 注:文件不存在则创建一个新文件
# wb 二进制写
# rb 二进制读
# ab 二进制追加
# w+ 读写模式
# r+
# a+
# wb+
# rb+
# ab+
#以下三个函数测试w,r,a作用
# f = open('test', 'w', encoding='utf8') #文件打开以后,
# #会在内存生成一段数字(文件句柄或者文件对象)
# f.write('Hello world!')
# f.close()
# fread = open('test', 'r', buffering=-1, encoding='utf-8')
# content = fread.read()
# print('读文件' + ' ' + content)
# fread.close()
# fappend = open('test_append', 'a', encoding='utf-8')
# fappend.write("嘻嘻嘻")
# fappend.close()
#copy一个文件到当前路径
#1.先打开目标图片
#2.读图片内容(binary)
#3.在当前文件建立一个文件
#4.将图片内容写入文件
#5.关闭文件
#写二进制文件
# fresource = open(r'C:\Users\H\Desktop\pythonbasis\FileOperation\ez.jpg', 'rb')
# fdestanation = open('ezcopy1.jpg', 'wb')
# bbate = fresource.read()
# print(bbate) #将会打印二进制数
# fdestanation.write(bbate)
# fresource.close()
# fdestanation.close()
#视频,图片,文件很多以二进制方式保存的
#抛出一个问题,读写文件是二进制模式更快,还是非二进制模式更快呢?
#执行写操作时,首先将内容放入缓冲区,之后再进行写操作。
#read()函数一次性将文件读取,加载到内存中,在处理大文件时不适用
#读取一行
# fline = open('lines', 'r')
# line = fline.readline()
# print(line)
# fline.close()
#通过一行一行读取整个文件
# fline = open('lines', 'r')
# for line in fline:
# print(line)
# fline.close()
#一行一行写
l
=
[
'
1
',
'
2
',
'
3
'
]
fwriteline
=
open
(
'
write
'
,
'
w
'
)
for item
in l:
fwriteline.
write
(item
+
'
\n
'
)
fwriteline.
close
()
#readlines()函数,将文件内容按行的模式以列表的形式返回
# flines = open("lines", 'r')
# print(flines.readlines())
# flines.close()
#只想读取中间某几行tell() 返回当前文件操作指针所在位置
# with open('lines', 'r') as f:
# f.readline()
# f.seek(0) #将文件操作指针移动到指定位置
# print(f.tell())
#如果想要在某个位置插入一段内容,首先需要将文件读取并用一个数据结构
#存下来,之后操作该数据再执行写入
#文件操作仍有许多内容,大家可以根据以上的基础进行跟深入的研究。