Python入门之文件的具体操作

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'))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值