文件对象
文件对象
- 文件操作的三个步骤: 打开、读写、关闭
文本文件的操作
- str:字符。一个英文字符是字符,一个中文字符也是字符。
- bytes:字节。存储单位。不同的字符所占用的字节数不一样。
- 将一串2进制的01组合表示成相应的字符,是编码。美国常用的编码是ASCII
>>> s1 = 'a'
>>> s2 = '中'
>>> type(s1)
<class 'str'>
>>> type(s2)
<class 'str'>
>>> b1 = s1.encode() #将str转成bytes
>>> b2 = s2.encode()
>>> type(b1)
<class 'bytes'>
>>> type(b2)
<class 'bytes'>
>>> b1
b'a' #前缀b表示bytes类型
##########当一个字节正好能对应成一个字符进,就显示为字符,如果一个字节不能对应成一个字符,将会显示这个字节的16进制数。
>>> b2
b'\xe4\xb8\xad' # \x表示16进制数
>>> bin(0xe4b8ad)
'0b111001001011100010101101'
>>> b1.decode() #将bytes转成str
'a'
>>> b2.decode()
'中'
打开并读取文件
#cp /etc/passwd /tmp/mima
#python3
#默认以r读的方式打开,文件不存在则报错
>>>f = open('/tmp/mima') #打开文件,返回一个文件对象
>>> data = f.read() #read默认读取全部数据
>>> f.close() #关闭文件
>>>print(data)
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
################################
>>> f = open('/tmp/mima')
>>> data = f.read() #读取全部数据赋值给data
>>> data = f.read() #继续读取数据,重新赋值给data
>>> data #后面已经没有东西,空字符串
''
>>> f.close()
##################################
>>> f = open('/tmp/mima')
>>>f.readline() #读取文件的第一行
>>>f.readline() #继续向后读一行
>>>f.readlines() #继续将后面所有行读出来,存入列表
>>>f.close()
###################################
重要:读文本文件最常用的方法是for循环
###################################
>>> f = open('/tmp/mima')
>>>for line in f:
... print(line, end= '') #不加end,会多打印一行空行,print默认打印一个空行
...
>>>f.close()
########################################################################
打开文件并写入
#以w方式打开文件,文件不存在则创建,存在则清空
>>> f = open('/tmp/mima', 'w')
[root@node01 ~]# cat /tmp/mima
>>> f.write('hello world!\n') # 第一种方式写入
13 #表示写入了13个字节
[root@node01 ~]# cat /tmp/mima #仍然看不见内容
#写入数据,为提升效率,都临时保存到内存中。当内存中的数据达到一定量时写入磁盘。关闭文件时也会写入磁盘。
>>> f.flush() #立即同步到磁盘
[root@node01 ~]# cat /tmp/mima
hello world!
>>> f.writelines(['2nd line.\n','3rd line.\n']) #第二种列表方式写入
>>> f.close()
[root@node01 ~]# cat /tmp/mima
hello world!
2nd line.
3rd line.
#######################################################################################
以bytes方式处理文件
#任何文件都以2进制得方式存储的。可以将这些2进制文件读取出来。
在网上找个图片放到/tmp/下面,起个名称叫/tmp/girl.jpg
f = open('/tmp/girl.jpg','rb')
>>> f.read(10) #读取10个字节
b'\xff\xd8\xff\xe0\x00\x10JFIF'
>>>f.close()
###########################################################
写入文件需要以wb的方式打开,将bytes类型的数据写入
#1.不建议直接使用字面量,应该使用变量
#2.变量名应该有意义
#3.一次将所有数据读出,可能数据量太大
#代码需要改进的地方
###############把/tmp/目录下的非文本文件拷贝到/var/tmp/目录下######
f1 = open('/tmp/girl.jpg', 'rb')
f2 = open('/var/tmp/girl.jpg', 'wb')
data = f1.read()
f2.write(data)
f1.close()
f2.close()
#md5sum /tmp/girl.jpg /var/tmp/girl.jpg
#eog /var/tmp/girl.jpg
改进脚本
src_fname = '/tmp/girl.jpg'
dst_fname = '/var/tmp/girl.jpg'
src_fobj = open(src_fname,'rb')
dst_fobj = open(dst_fname,'wb')
while 1:
data = src_fobj.read(4096) #一次最多读取4096字节
if not data: #如果data为空,表示假,取反为真;如果data非空,表示真,取反为假
break
dst_fobj.write(data)
src_fobj.close()
dst_fobj.close()
########################################
with子句
如果通过with语句打开文件,with语句结束,文件自动关闭.
>>> with open('/tmp/mima') as f:
... f.readline()
...
'hello world!\n'
>>> f.readline() #不能在已关闭的文件中读数据
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: I/O operation on closed file.
################################################
移动文件指针
- 在不关闭文件的情况下,使用seek函数移动文件指针
- seek接受两个参数,第2个参数是位置(0表示开头。1表示当前位置,2表示结尾)
第1个参数是相对第2个参数的偏移量 - tell函数返回文件指针相对开头的偏移量
[root@node01 ~]# cat /tmp/mima
hello world!
2nd line.
3rd line.
>>> f = open('/tmp/mima', 'rb')
>>> f.tell()
0
>>> f.read(5) #读取5字节
b'hello'
>>> f.tell()
5
>>> f.seek(-6, 2) #将文件指针移动到结尾向左6个字节处
27
>>> f.read()
b'line.\n'
hello world! #开头是0(hello前面是0),结尾是2l(ine.后面是结尾)中间是1,默认每行后面有个\n。
2nd line.
3rd line.
####################################################################################

浙公网安备 33010602011771号