一、文件指针
文件指针标记在哪个位置,就从哪个位置开始读取数据
第一次打开文件时,通常文件指针会指向文件的开始位置,当read方法执行后,文件指针会移动到读取内容的行末尾
实例【1】
执行的源码:
注意:尽量自己写一个文件,不要用根目录下面的目录或文件,以防操作中损坏文件内容
#打开文件
file =open('passwd')
#read方法读取文件内容(一次性返回文件的所有内容)
text =file.read()
print text
print type(text)
print len(text)
print '********'
#移动文件指针到文件开头
file.seek(0)
text = file.read()
print len(text)
#close方法负责关闭文件
file.close()
对passwd文件操作,文件中的内容如下:
执行结果演示:
二、如何读取大文件
read方法:默认会把文件的所有内容一次性读到内存,如果文件太大,对内存的占用会非常严重
readline方法:可以一次性读取一行内容,方法执行后,会把文件指针移动到下一行,准备再次读取
正确读取大文件的方法:
# 正确读取大文件
file = open('passwd')
# 为什么要设定为无限循环:
# 因为我们不知道循环的条件,我们不知道文件到底有多少行
while True:
text = file.readline()
# 判断是否读取到了内容
# 如果文件指针到文件的最后一行,那么就读取不到内容了
if not text:
break
# 每读取一行的末尾已经有一个‘\n’
print text
file.close()
三、复制文件
需求是:打开一个已经有的文件,读取完整的内容,并写到另一个文件中去
# 源文件以只读的方式打开
file_read = open('passwd')
# 目标文件以只写的方式打开
file_write = open('passwd_copy','w')
# 从源文件中读取内容
text = file_read.read()
# 将读取到的内容写到目标文件
file_write.write(text)
# 关闭文件
file_read.close()
file_write.close()
执行结果可以看出,当代码执行完之后会出现一个叫passwd_copy的文件
四、处理文件
可以对文件执行的操作有读,写,追加(r,r+、w,w+、a,a+)
这三个操作的作用:
r:
-只能读,不能写
-读取的文件不存在,会报错
r+:
-可读可写
-文件不存在,报错
w:
-只能写,不能读
-会清空问覆盖文件内容
-如果文件不存在,会新建文件
w+:
-可读可写
-文件存在,会覆盖原文件
-文件不存在,创建新文件
a:
-只能写,不能读
-文件不存在,新建文件不报错
-文件存在,不会清空文件内容
a+:
-可读可写
-文件不存在的时候,新建文件
-文件存在,不会覆盖原文件内容
对文件操作的三部曲:打开(open),操作(r,w,a),关闭(close)
f = open('passwd','r')
content = f.read()
#f.write('redhat') #往文件中写内容
print content
f.close()
以只读方式打开文件
若是打开写的那一行,就会执行报错
五、读取二进制文件的内容
f1 = open('han.jpeg',mode='rb') #han.jpeg这个二进制文件存在
content = f1.read()
f1.close()
f2 = open('happy.png',mode='wb') #happy这个文件不存在
f2.write(content)
f2.close()
han.jpeg二进制文件内容
最后生成的happpy.png文件
六、with open() as 处理文件
通过使用with结构,可让python去确定,你只管打开文件,并在需要时使用它,python会在合适的时候自动将其关闭
我们调用了open(),但没有调用close();你也可以调用open()和close来打开和关闭文件,但这样做时,如果程序存在bug,导致close()语句没有执行,文件将不会关闭,未妥善地关闭文件可能会导致数据丢失或受损。
1、读取文件内容
with open('passwd') as f:
lines=f.readline()
print lines
readline方法一次只能读取一行文件内容
2、逐行读取文件内容
with open('passwd') as f:
lines=f.readline()
print lines
for line in lines:
print line
七、文件的练习题
题目内容:
- 生成一个大文件ips.txt,要求1200行, 每行随机为172.25.254.0/24段的ip;
- 读取ips.txt文件统计这个文件中ip出现频率排前10的ip。
import random
def create_ips_file(filename):
ips = ['172.25.254.' + str(i) for i in range(1, 255)]
with open(filename, 'a+') as f:
for count in range(1200):
f.write(random.sample(ips, 1)[0] + '\n')
def sorted_by_ip(filename,count =10):
ips_dict = dict()
with open(filename) as f:
for ip in f:
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')