• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
花儿爷
博客园    首页    新随笔    联系   管理     
python_文件处理

文件操作

文件操作三部曲;

1、打开文件

2、对文件句柄操作

3、关闭文件

f1 = open('测试1',encoding='utf-8',mode='r')
content = f1.read()
print(content)
f1.close()

open() 方法用于打开一个文件,并返回文件对象,open底层调用的是操作系统的接口,如果该文件无法被打开,会抛出 OSError。

f1,变量,f1,fh,file+handler,f_h,文件句柄,对文件进行任何操作,都是通过文件句柄的方式,

编码方式encoding:可以不写,不写参数默认编码本;操作系统默认编码;

一般来说:你的文件用什么编码保存的,就用什么方法打开,一般都是用utf-8(有些使用的是gbk)

Windows:gbk,

Linux:utf-8

Mac:utf-8,

close() :使用 open() 方法一定要保证关闭文件对象,即调用 close() 方法。

open() 函数常用形式是接收两个参数:文件名(file)和模式(mode)。

参数说明:

  • file: 必需,文件路径(相对或者绝对路径)。
  • mode: 可选,文件打开模式
  • buffering: 设置缓冲
  • encoding: 一般使用utf8
  • errors: 报错级别
  • newline: 区分换行符
  • closefd: 传入的file参数类型
  • opener:

不同打开文件方式:

 

文件方法:

文件操作的操作模式分为三个类:读,写,追加。

#1. 打开文件的模式有(默认为文本模式):
r ,只读模式【默认模式,文件必须存在,不存在则抛出异常】
w,只写模式【不可读;不存在则创建;存在则清空内容】
a, 只追加写模式【不可读;不存在则创建;存在则只追加内容】

#2. 对于非文本文件,我们只能使用b模式,"b"表示以字节的方式操作(而所有文件也都是以字节的形式存储的,使用这种模式无需考虑文本文件的字符编码、图片文件的jgp格式、视频文件的avi格式)
rb 
wb
ab
注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码

#3,‘+’模式(就是增加了一个功能)
r+, 读写【可读,可写】
w+,写读【可写,可读】
a+, 写读【可写,可读】

#4,以bytes类型操作的读写,写读,写读模式
r+b, 读写【可读,可写】
w+b,写读【可写,可读】
a+b, 写读【可写,可读】

读:读的四种模式:r,rb,r+,r+b

r只读模式

以只读方式打开文件,文件的指针将会放在文件的开头。是文件操作最常用的模式,也是默认模式,如果一个文件不设置mode,那么默认使用r模式操作文件。

# r 只读
f = open('测试1',encoding='utf-8',mode='r')
'''
#r = f.read()   #全部读取,弊端 如果文件很大就会非常的占用内存,容易导致内存奔溃.
r = f.read(2)   #按照字符读取,从1开始
print(r)   # type(r) <class 'str'>

r1 = f.readline().strip()   # readline()读取一行
r2 = f.readline().strip()  # 注意点:readline()读取出来的数据在后面都有一个\n,所以需要加一个strip()
print(r1)
print(r2)

r3 = f.readlines()  # readlines() 返回一个列表,列表里面每个元素是原文件的每一行,如果文件很大,占内存,容易崩盘。
print(r3)           # ['杨洋\n', '刘诗诗\n', '肖战']
'''
#可以通过for循环去读取,文件句柄是一个迭代器,他的特点就是每次循环只在内存中占一行的数据,非常节省内存
for line in f :
    print(line.strip())   #这种方式就是在一行一行的进行读取,
f.close()

读:rb以二进制格式打开一个文件用于只读模式:

rb模式:以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。记住下面讲的也是一样,带b的都是以二进制的格式操作文件,他们主要是操作非文字文件:图片,音频,视频等,并且如果你要是带有b的模式操作文件,那么不用声明编码方式。

# rb
f = open('宝可梦.jpg',mode='rb')
r = f.read()
print(r)     # b'\xff\xd8\xff\xe0...
f.close()

rb模式也有read read(n) readline(),readlines() for循环这几种方法;

r+读写模式

r+: 打开一个文件用于读写。文件指针默认将会放在文件的开头。

# 如果你在读写模式下,先写后读,那么文件就会出问题,因为默认光标是在文件的最开始,你要是先写,则写入的内容会讲原内容覆盖掉,直到覆盖到你写完的内容,然后在后面开始读取。
f = open('测试1',encoding='utf-8',mode='r+')
r = f.read()
print(r)
f.write('\n嗯哼')
f.close()

写:四种模式:w,wb,w+,w+b

w模式

写就是在文件中写入内容。这里也有四种文件分类主要四种模式:w,wb,w+,w+b,

#如果文件不存在,利用w模式操作文件,那么它会先创建文件,然后写入内容.
#如果文件存在,利用w模式操作文件,先清空原文件内容,在写入新内容。
f = open('测试2',encoding='utf-8',mode='w')
r = f.write("哈哈")     #以字符串类型写入
f.close()

wb模式:

以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如:图片,音频,视频等。

#第一步:将原图片通过rb模式读取出来
f = open('宝可梦.jpg',mode='rb')
r = f.read()
f.close()
#第二步:将读取出来的数据通过wb模式写入新文件
f1 = open('宝可梦1.jpg',mode='wb')
f1.write(r)
f.close()

追加:四种模式:a,ab,a+,a+b

a模式

打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。

f = open('测试2',encoding='utf-8',mode='a')
f.write('\nbb')
f.close()

打开文件的另一种方式

Python也给咱们提供了另一种方式:with open() as .... 的形式,那么这种形式有什么好处呢?

# 1,利用with上下文管理这种方式,它会自动关闭文件句柄。
with open('测试1',encoding='utf-8') as f:
    print(f.read())

# 2,一个with 语句可以操作多个文件,产生多个文件句柄。
with open('测试1',encoding='utf-8') as f1,\
        open('测试2',encoding='utf-8',mode='w') as f2:
    print(f1.read())
    f2.write('aa')

这里要注意一个问题,虽然使用with语句方式打开文件,不用你手动关闭文件句柄,比较省事儿,但是依靠其自动关闭文件句柄,是有一段时间的,这个时间不固定,所以这里就会产生问题,如果你在with语句中通过r模式打开t1文件,那么你在下面又以a模式打开t1文件,此时有可能你第二次打开t1文件时,第一次的文件句柄还没有关闭掉,可能就会出现错误,他的解决方式只能在你第二次打开此文件前,手动关闭上一个文件句柄。

文件的修改:

文件的数据是存放于硬盘上的,因而只存在覆盖、不存在修改这么一说,我们平时看到的修改文件,都是模拟出来的效果,具体的说有两种实现方式:

方式一:将硬盘存放的该文件的内容全部加载到内存,在内存中是可以修改的,修改完毕后,再由内存覆盖到硬盘(word,vim,nodpad++等编辑器)

import os
# 1、以读模式打开原文件
# 2、以写模式创建一个新文件
with open('测试1',encoding='utf-8') as f1,\
    open('测试2',encoding='utf-8',mode='w') as f2:
# 3、将原文件的内容读出来修改成新内容,写入新文件
    old_content = f1.read()
    new_content = old_content.replace('三三','四四')
    f2.write(new_content)
# 4、将原文件删除
os.remove('测试1')
# 5、将新文件重命名成原文件
os.rename('测试2','测试1')

方式二:将硬盘存放的该文件的内容一行一行地读入内存,修改完毕就写入新文件,最后用新文件覆盖源文件

import os
with open('测试1',encoding='utf-8') as f1,open('测试2',encoding='utf-8',mode='w') as f2:
    for line in f1:
        line = line.replace('四四','五五')
        f2.write(line)
os.remove('测试1')
os.rename('测试2','测试1')

详细操作:

 

'''文件操作'''
#只读r
#open() 方法一定要保证关闭文件对象,即调用 close() 方法
# f=open('C:\\Users\\12978\Desktop\\foin.txt',mode='r',encoding='utf-8') #绝对路径
# content=f.read()
# print(content,type(content))  #类型为str
# f.close()

#rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头
# f=open('C:\\Users\\12978\Desktop\\foin.txt',mode='rb')
# content=f.read()
# print(content,type(content))  #类型为bytes
# f.close()   #结果:b'\xef\xbb\xbf\xe4\xbd\xa0\xe5\xa5\xbd\xe9\xb8\xad'

#r+ 读写
# f=open('C:\\Users\\12978\Desktop\\foin.txt',mode='r+',encoding='utf-8')
# print(f.read())
# f.write('小明,晓红')
# f.close()

#r+b 读写(以bytes类型)以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头
# f=open('C:\\Users\\12978\Desktop\\foin.txt',mode='r+b')
# print(f.read())
# f.write('小明,晓红'.encode('utf-8'))
# f.close()

#只写:w  打开一个文件只用于写入。该文件不存在,创建新文件。
# 先将源文件的内容全部清除,在写。
# f=open('C:\\Users\\12978\Desktop\\foin.txt',mode='w',encoding='utf-8')
# f.write('大王,小王')
# f.close()

#wb  以二进制格式打开一个文件只用于写入
# f=open('wa.txt',mode='wb',)
# f.write('哇哈哈'.encode('utf-8'))
# f.close()

#w+打开一个文件用于读写
# f = open('wa.txt',mode='w+',encoding='utf-8')
# f.write('aaa')
# f.seek(5)  #设置文件当前位置,移动到当前文件第6个字节
# print(f.read())
# f.close()

# a 追加
# f = open('wa.txt',mode='a',encoding='utf-8')
# f.write('huahua')
# f.close()

#ab一二进制文件追加
# f = open('wa.txt',mode='ab')
# f.write('我是新星星'.encode('utf-8'))
# f.close()

#功能详解
f=open('C:\\Users\\12978\Desktop\\foin.txt',mode='r',encoding='utf-8') #绝对路径
content=f.read(2)  #read() 方法用于从文件读取指定的字节数,如果未给定或为负则读取所有
f.seek(3)  #是按照字节定光标的位置
f.tell()
print(f.tell())    #打印出光标得位置
f.readable()  # 是否刻度
line = f.readline()  # 一行一行的读
line = f.readlines()  # 每一行当成列表中的一个元素,添加到list中
for line in f:
    print(line)
print(content,type(content))  #类型为str
f.close()

 登录和注册例子

#登录注册
username=input('请输入你要注册得用户名:')
password=input('请输入你要注册得密码:')
with open('list_of_info',mode='w',encoding='utf-8') as f:
    f.write('{}\n{}'.format(username,password))
print('注册成功')
list=[]
i=0
while i<3:
    name=input("请输入用户名:")
    pwd=input('请输入密码:')
    with open('list_of_info',mode='r+',encoding='utf-8') as f1:
        for line in f1:
            list.append(line)
    if name == list[0].strip() and pwd == list[1].strip():
        print('登录成功')
        break
    else:
        print('账号和密码错误')
    i+=1
posted on 2018-06-13 14:34  flowerszhao  阅读(140)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3