1.文件操作的步骤:
(1)打开文件open()
方法用于打开一个文件,并返回文件对象,使用变量接收该文件对象。open()
函数常用形式是接收两个参数:文件名(file)和模式(mode)。文件名称指定将要进行操作的具体文件,模式指定可以对该打开的文件对象进行的操作(读,写)
(2) 对文件对象进行操作
(3) 关闭文件对象close()
方法用于关闭一个打开的文件对象,在文件对象关闭之后,不能再对其进行任何读写操作。
2.文件对象操作的方法:
read()方法 :read()
方法从一个打开的文件中读取一个字符串,被传递的参数是要从已打开文件中读取的字节计数。该方法从文件的开头开始读入,如果没有传入count,它会尝试尽可能多地读取更多的内容,很可能是直到文件的末尾
write()方法write()
方法可将任何字符串写入一个打开的文件。需要重点注意的是,Python字符串可以是二进制数据,而不是仅仅是文字,write()方法不会在字符串的结尾添加换行符(’\n’), 在这里,被传递的参数是要写入到已打开文件的内容
3.判断文件是否可读写及状态:
f.readable()
#文件对象是否可读,返回为True或者False
f.writable()
#文件对象是否可写,返回为True或者False
f.closed
#文件对象是否已经关闭,返回为True或者False
注意:打开文件时,不加以说明,则文件默认只有可读权力
4.文件定位以及修改指针的位置:
文件定位:tell()方法告诉你文件内的当前位置, 换句话说,下一次的读写会发生在文件开头这么多字节之后
seek(偏移量 ,参考位置)方法改变当前文件的位置。
偏移量表示要移动的字节数(<0 表示向左偏移;>0表示向右偏移)。参考位置指定开始移动字节的参考位置。
如果参考位置被设为0,这意味着将文件的开头作为移动字节的参考位置。如果设为1,则使用当前的位置作为参考位置。如果它被设为2,那么该文件的末尾将作为参考位置。
5.纯文本对象读取参数:
参数 | 参数说明 |
r(默认) | (1)只能读,不能写(2)读取的文件不存在,会报错 |
r+ | (1)可读写(2)文件不存在,会报错(3)默认从文件指针所在位置开始写入 |
w | (1)只能写(2)会清空文件之前的内容(3)文件不存在,不会报错,会创建新的文件并写入 |
w+ | (1)可读写(2)会清空文件内容(3)文件不存在,不会报错,会创建新的文件并写入 |
a | (1)只能写(2)文件不存在,不报错(3)不会清空文件内容 |
a+ | (1)可读写(2)文件不存在,不报错(3)不会清空文件内容 |
接下来,以r+参数
进行操作示例:r+,默认从文件指针所在位置开始写入
(1)先读后写
f = open('/mnt/passwd','r+')
f.read()
print(f.tell()) #读完文件后指针所在位置
f.write('kangzhengheng')
print(f.tell()) #写完后指针所在位置
f.close()
(2)先写后读
f = open('/mnt/passwd','r+')
print(f.tell()) #读完文件后指针所在位置
f.write('kangzhengheng')
print(f.tell()) #写完后指针所在位置
f.close()
6.非纯文本对象读取:
读取文本文件:r、r+、w、w+、a、a+
读取二进制文件:rb、rb+、wb、wb+、ab、ab+
f = open('redhat.jpg',mode='rb') #读取二进制文件,如图片
content = f.read()
f.close()
f1 = open('hello.jpg',mode='wb') #将redhat.jpg写入到hello.jpg文件中(拷贝)
f1.write(content)
f1.close()
#运行后,结果显示栏没有提示信息,表示文件成功读取并写入,
可以在左侧的项目栏发现test.jpg和hello.jpg两个文件
7.文件读取方式:
(1)按行读取 每次仅读取一行
f = open('/mnt/passwd','r+')
print(f.readline())
f.close()
(2)按字节读取
print(f.read(4)) #读取4个字符
print(f.readline(),end='') #读取一行
(3)readlines():读取全部行
readlines():读取文件内容,返回一个列表,列表里的元素分别为文件每行的内容
f = open('/tmp/passwd','r+')
print(f.readlines())
f.close()
我们可以看到readlines()方法,读取文件内容,会返回一个列表,列表中的每个项后都会产生一个换行符,去掉这些换行符操作如下:
方法一:
print([line.strip() for line in f.readlines()])
方法二:
print(list(map(lambda x:x.strip(),f.readlines())))
(4)seek指针移动读取
seek方法,移动指针
seek第一个参数是偏移量:>0,代表向右移动,<0,代表向左移动
seek第二个参数是: 0(移动指针到文件开头)、 1(不移动指针)、2(移动指针到末尾)
不移动指针,写入内容后,读取文件内容会直接从写完内容后的位置开始读取
f = open('/tmp/passwd','r+')
print(f.tell())
print(f.write('redhat'))
print(f.tell())
print(f.read())
f.close()
使用seek移动指针,可以查看到之前写入的内容
f = open('/tmp/passwd','r+')
print(f.tell())
print(f.write('redhat'))
print(f.tell())
f.seek(0,0)
print(f.tell())
print(f.read())
f.close()
8.上下文管理器:
上下文管理器:打开文件,执行完with语句内容之后,自动关闭文件
格式:
with open(文件路径) as 变量:
<要进行的操作>
with open('/mnt/passwd') as f: ##以f文件打开
print(f.read())
print('after with语句:',f.close()) ##执行完关闭文件
kiosk:x:1000:1000:kiosk:/home/kiosk:/bin/bash
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
after with语句: None ##关闭文件则none
文件的复制:将第一个文件的内容写入到第二个文件中
with open('data.txt') as f1,open('data2.txt','w+') as f2:
f2.write(f1.read()) ##f2内写入的是f1读取到的内容
f2.seek(0,0)
print(f2.read()) ##读取f2内容
2019 6 4
2019 6 4
9.文件练习:
(1)创建文件data.txt,共100000行,每行存放一个1~100之间的整数
import random
#方法一:
f = open('data.txt','w+')
for i in range(100000):
f.write(str(random.randint(1,100)) + '\n')
f.seek(0,0)
print(f.read())
f.close()
#方法二:
import random
with open('data2.txt','w+') as f:
for i in range(10000):
f.write(str(random.randint(1,100)) + '\n')
(2) 生成一个大文件ips.txt,要求1200行,每行随机为172.25.254.0/24段的ip;读取ips.txt文件统计这个文件中ip出现频率排前10的ip;
# from collections import Iterable
# f = open('/tmp/passwd')
# print(isinstance(f,Iterable))
# for i,item in enumerate(f):
# if i == 10:
# break
# print(i,item)
import random
def create_ip(filename):
ip = ['172.25.254.' + str(i) for i in range(1,255)]
# print(random.sample(ip,1))
with open(filename,'a+') as f:
for i in range(1200):
f.write(random.sample(ip,1)[0] + '\n')
# create_ip('ips.txt')
def sorted_by_ip(filename,count=10):
ips_dict = dict()
with open(filename) as f:
for ip in f:
ip = ip.strip()
if ip in ips_dict:
ips_dict[ip] += 1
else:
ips_dict[ip] = 1
sorted_ip = sorted(ips_dict.items(),key=lambda x:x[1],reverse=True)[:count]
return sorted_ip
print(sorted_by_ip('ips.txt'))