python—文件

1、文件操作的步骤

1 打开文件
open() 方法用于打开一个文件,并返回文件对象,使用变量接收该文件对象。
open() 函数常用形式是接收两个参数:文件名(file)和模式(mode)。文件名称指定将要进行操作的具体文件,模式指定可以对该打开的文件对象进行的操作(读,写)

2 对文件对象进行操作

3 关闭文件对象
close() 方法用于关闭一个打开的文件对象,在文件对象关闭之后,不能再对其进行任何读写操作。

2、对文件对象进行操作

read()方法 :
read()方法从一个打开的文件中读取一个字符串,被传递的参数是要从已打开文件中读取的字节计数。该方法从文件的开头开始读入,如果没有传入count,它会尝试尽可能多地读取更多的内容,很可能是直到文件的末尾

write()方法
write()方法可将任何字符串写入一个打开的文件。需要重点注意的是,Python字符串可以是二进制数据,而不是仅仅是文字,write()方法不会在字符串的结尾添加换行符(’\n’), 在这里,被传递的参数是要写入到已打开文件的内容
对文件能进行的具体操作,由打开文件对象的时候使用的mode参数决定。

1、 f = open(’/public/toto’,mode=‘r’) :r(默认参数):

只能读,不能写
读取文件不存在 会报错

2 、f = open(’/public/toto’,mode=‘w’) :w(写):

write only(只能进行写操作)
文件不存在的时候,会自动创建新的文件
文件存在的时候,会清空文件内容并写入新的内容

3 、f = open(’/public/toto’,mode=‘a’) :a(追加):

write only(只能进行写操作)
写:不会清空文件的内容,会在文件末尾追加
写:文件不存在,不会报错,会创建新的文件并写入内容

4 、f = open(’/public/toto’,mode=‘r+’) :r+

-r/w(读/写权限)
-文件不存在,报错
-默认情况下,从文件指针所在位置开始写入

5 、f = open(’/public/toto’,mode=‘w+’) :w+

-r/w(读/写权限)
-文件不存在,不报错,会自动创建新的文件
-会清空文件内容

6 、 f = open(’/public/toto’,mode=‘a+’) :a+

-r/w(读/写权限)
-文件不存在,不报错,会自动创建新的文件
-不会清空文件,在末尾追加

文本文件与二进制文件(视频,音频,图片)

对纯文本文件进行操作时候,mode参数:t表示文本文件

r  r+  w  w+  a  a+  == rt  rt+  wt  wt+  at  at+

对二进制文件进行操作时候,mode参数:b表示文本文件

rb rb+ wb wb+ ab ab+

注意

使用参数w/w+/wb/wb+ 打开文件对象的时候,默认一定会写入内容到打开的文件中,对文件中的元内容进行覆盖,如果使用这些参数打开文件对象,但是并没有写入任何东西在文件中,那么文件内容将会被清空。
对文件进行读取,从文件的什么位置开始进行操作,由指针当前所在的位置决定,指针在什么地方,从什么地方开始。
使用参数r+对文件对象进行写操作的时候,从什么地方开始写入,由指针当前的位置进行决定。

[kiosk@foundation31 lianxi_0605]$ cat 01.py 
f = open('/public/toto',mode='w')       
f.close()   # 使用参数w打开文件对象,并没有进行任何的操作

[kiosk@foundation31 lianxi_0605]$ cat /public/toto   # 源文件中存在的源内容
1234lalaleledodowestos
123412341234

[kiosk@foundation31 lianxi_0605]$ python3 01.py   # 运行之后
[kiosk@foundation31 lianxi_0605]$ cat /public/toto   # 文件中的内容被清空了
[kiosk@foundation31 lianxi_0605]$ 

.

[kiosk@foundation31 lianxi_0605]$ cat /public/lala  #文件内容
0123456789

[kiosk@foundation31 lianxi_0605]$ cat 01.py   # 脚本内容
f = open('/public/lala',mode='r')
print(f.tell())  # 显示当前指针位置
f.seek(5,0)  # 移动指针到指定位置
print(f.tell())
a = f.read()  # 进行读操作
print(a)  # 显示读取到的结果

[kiosk@foundation31 lianxi_0605]$ python3 01.py 
0   # 刚开始的时候 指针在0 开头位置
5  # 将其启动到 5 位置(第五个字符)
56789  #读取到的内容就是从指针所在的下一个字符开始

3、文件定位以及修改指针的位置

文件定位:tell()方法告诉你文件内的当前位置, 换句话说,下一次的读写会发生在文件开头这么多字节之后
seek(偏移量 ,参考位置)方法改变当前文件的位置。

偏移量表示要移动的字节数(<0 表示向左偏移;>0表示向右偏移)。参考位置指定开始移动字节的参考位置。
如果参考位置被设为0,这意味着将文件的开头作为移动字节的参考位置。如果设为1,则使用当前的位置作为参考位置。如果它被设为2,那么该文件的末尾将作为参考位置。

[kiosk@foundation31 lianxi_0605]$ cat 01.py    # 脚本内容
f = open('/public/lala',mode='rb')   # 打开文件对象
print(f.tell())  # 显示当前文件位置
f.seek(5,0)  # 从开头向后移动5个字节
print(f.tell()) # 显示当前文件位置
f.seek(-2,1)  # 从当前位置向移动2个字节
print(f.tell()) # 显示当前文件位置
f.seek(-1,2)  # 从最后向前移动1个字节
print(f.tell()) # 显示当前文件位置
f.seek(0,0)   # 移动到文件开头
print(f.tell()) # 显示当前文件位置
f.seek(0,2)  # 移动到文件末尾
print(f.tell()) # 显示当前文件位置
f.close()

[kiosk@foundation31 lianxi_0605]$ cat /public/lala
0123456789     # 显示的文件内容

[kiosk@foundation31 lianxi_0605]$ python3 01.py    # 显示每次移动输出的结果
0
5
3
9
0
10

4 、判断文件对象拥有的权限以及状态

f.readable() #文件对象是否可读,返回为True或者False
f.writable() #文件对象是否可写,返回为True或者False
f.closed #文件对象是否已经关闭,返回为True或者False

5、多种读取文件的方式

1 按行读取
f.readline() #每次读取一行,f引用打开的文件对象
f.readline(count) #每次读取一行中的count个字节,f引用打开的文件对象
2 按字节读取
f.read(count) #每次读取文件中的count个字节,f引用打开的文件对象
3 读取文件内容,并返回一个列表,列表元素分别为文件的行内容
f.readlines()

[kiosk@foundation31 lianxi_0605]$ cat /public/toto  # 文件内容
hahahahahah
lalalalalal
tototototot
[kiosk@foundation31 lianxi_0605]$ cat 01.py   # 脚本内容
f = open('/public/toto',mode='r')
a = f.readlines()
print(a)
f.close()
[kiosk@foundation31 lianxi_0605]$ python3 01.py   #运行结果 返回一个列表
['hahahahahah\n', 'lalalalalal\n', 'tototototot\n']
[kiosk@foundation31 lianxi_0605]$ 

6、上下文管理器

上下文管理器:打开文件,执行完with语句内容之后,自动关闭文件
格式:

with open(文件路径) as 变量:
	<要进行的操作>

.

with open('/public/toto',mode='r') as f:
    print('with 语句里面'  ,f.closed)
print('with 语句外面' , f.closed)

#运行结果:
with 语句里面 False  
with 语句外面 True  # 当结束with 语句的时候,文件自动关闭

python3.x中可以同时打开多个文件进行操作

#同时打开文件/public/toto 以及文件/public/toto1
with open('/public/toto',mode='r') as f1 , open('/public/toto1' ,mode='w+') as f2: 
    content = f1.read()  #读取第一个文件中的内容
    print(content)  # 显示第一个文件的内容
    f2.write(content)   # 将第一个文件的内容写入到第二个文件中
    f2.seek(0,0)
    print(f2.read())  # 显示第二个文件的内容

#输出结果:
111111222222
111111222222  # 成功将第一个文件的内容复制到第二个文件中

应用练习:

1 创建文件data.txt 文件共100000行,每行存放以一个1~100之间的整数

import random

with open('/public/date.txt',mode='w') as f1:
    for i in range(100000):
        f1.write(str(random.randint(1,100)) + '\n')

2 生成100个MAC地址并写入文件中,MAC地址前6位(16进制)为01-AF-3B
01-AF-3B-xx-xx-xx
注意:MAC地址为12位,由16进制数组成的

import random
import string
def mac1():
    s1 = ['01','AF','3B']
    s2 = [ ''.join(random.sample(string.hexdigits,2)).upper() for i in range(3)]
    mac = '-'.join(s1 + s2)
    return mac
with open('/public/MAC.txt','w') as f :
    for i in range(100):
        f.write(mac1()  + '\n')

3-1. 生成一个大文件ips.txt,要求1200行,每行随机为172.25.254.0/24段的ip

import random
def ip():
    s1 = '172.25.254.'
    s2 = str(random.randint(0,255))+'/24'
    return s1+s2
with open('/public/ips.txt','w') as f:
    for i in range(1200):
        f.write(ip() + '\n')

3-2. 读取ips.txt文件统计这个文件中ip出现频率排前10的ip;

with open('/public/ips.txt','r') as f:
    a = f.readlines()
    a1 = set(a)
    a2 = [(i,a.count(i))  for i in a1]
    print(sorted(a2,key=lambda x:x[1],reverse=True)[:10])
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值