Python中的文件处理

一、文件指针

文件指针标记在哪个位置,就从哪个位置开始读取数据

第一次打开文件时,通常文件指针会指向文件的开始位置,当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

七、文件的练习题

题目内容:

  1. 生成一个大文件ips.txt,要求1200行, 每行随机为172.25.254.0/24段的ip;
  2. 读取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')

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值