文件对象

                                                                           文件对象

  • 文件操作的三个步骤: 打开、读写、关闭

                                                                       文本文件的操作

  •  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.

####################################################################################

 

posted @ 2020-09-13 14:22  翟超  阅读(339)  评论(0)    收藏  举报