05-python文件操作-open()


open()函数用于打开文件,并获得文件内容
打开文件的方式有 r(只读), w(只写), a(追加), r+, w+, a+, rb, wb, ab, r+b, w+b, a+b
读取文件的方式有:
read() 读取全部文件内容
readline() 一行一行读取文件内容
readlines() 以列表的方式读取文件内容

一、读模式

0、读取文件名

# 以只读的方式打开文件file.txt,并交给变量f
f = open('file.txt', mode='r', encoding='utf-8')
print(f.name)
---------------------------
file.txt

1、只读操作 (r)
用于读取文本信息
如果文件中有中文需要指定编码 encoding=‘utf-8’
文件不存在会报错
相对路径…/ 从当前目录返回到上级目录下面
绝对路径,从根目录开始查找
pycharm可以正常使用D:/alex.jpg打印windows路径, 或者使用D:\alex.jpg 都可以

(1) 打开相对路径文件,mode可以不用加
f = open('file.txt',mode='r', encoding='utf-8')
print(f.read())

f = open('../day-3/img/呵呵.txt','r',encoding='utf-8')
print(f.read())


(2) 打开绝对路径文件
# 使用linux路径方式 /../
f = open('D:/pycharm存放数据/python28期/day-3/file.txt','r',encoding='utf-8')
print(f.read())

# 使用windows路径方式 r'\..\', r是转义
f = open(r'D:\pycharm\python自动化28期\day-2\file.txt', 'r', encoding='utf-8')
print(f.read())

# 使用windows方式 \\..\\, 第一个\是转义
f = open('D:\\pycharm\\python自动化28期\\day-2\\file.txt', 'r', encoding='utf-8')
print(f.read())

2、只读操作 (rb)
用于读取非文本信息,比如读取mp3,图像,视频等信息就需要用到rb
rb 读取出来的数据是bytes类型,在rb模式下,不能使用encoding字符集

f = open('file.txt', 'rb')
print(f.read)
-------------------------------
<built-in method read of _io.BufferedReader object at 0x000000000016AEB8>


# 通过rb读取并复制图片(在D盘中读取图片,在E盘中写入文件)
f1 = open('D:/1.jpg','rb')
f2 = open('E:/1.jpg','wb')
for line in f1:
    f2.write(line)
f1.close()
f2.close()

3、读取文件的方法
read() 将文件内容全部读取出来,占用内存,如果文件太大容易导致内存崩溃 (不推荐使用)
close() 读取完的文件句柄记得关闭

f = open('file.txt', 'r', encoding='utf-8')
f1 = f.read()
f.close()
print(f1)

# 推荐使用for循环逐行读取
f = open('file.txt','r',encoding='utf-8')
for i in f:
    print(i.strip() + 'sb')
  • read(n) 去读n个字符,如果再次读取会在当前位置继续读下去,而不会从头读
"""
文件内容弄:
    你好abcdefgh
"""

f = open('file.txt', 'r', encoding='utf-8')
print(f.read(3))            #读取3个字符
print(f.read(3))            #从当前位置再读取3个字符
f.close()
------------------------
你好a
bcd
  • readline() 一次读取一行,注意readline()读取的内容有\n,需要通过split()去掉
(1) 一次读取一行内容
"""
文件内容:
    你好abcdefgh
    hello world
    111111111
    222222222
"""
f = open('file.txt', 'r', encoding='utf-8')
print(f.readline())
print(f.readline())
print(f.readline())
f.close()
----------------------------------------------
你好abcdefgh

hello world

111111111

(2) 循环当前行内容的每一个元素
# 文件内容
"""
ABCD你
我
alex
北京
"""
f = open('file.txt','r+', encoding='utf-8')
for i in f.readline():
    print(i)
------------------------------------------
A
B
C
D
你
  • readlines()会读取文件全部内容,并且将每一行形成一个元素,放到一个列表中,也容易出现内存崩溃问题(不推荐使用)
"""
文件内容:
    你好abcdefgh
    hello world
    111111111
    222222222
"""

(1)读取每行内容并存入列表
f = open('file.txt', 'r', encoding='utf-8')
print(f.readlines())
f.close()
----------------------------------------------
['你好abcdefgh\n', 'hello world\n', '111111111\n', '222222222\n']



(2)通过for循环读取,每次循环一行内容,就不会造成内存溢出了
# for循环中readlines可以不用加,效果是一样的
f = open('file.txt', 'r', encoding='utf-8')
for i in f.readlines():       #循环列表中的每一个元素
    print(i.strip())
f.close()
--------------------------------------------
你好abcdefgh
hello world
111111111
222222222


二、写模式

1、写模式一 (w)
写的时候,没有文件会创建文件,如果文件存在会将文件内容删除并写入新的内容
如果写入中文内容需要指定字符编码 encoding=‘utf-8’
写完之后记得flush()刷新一下,目的是把内容从存储中真正地写入到文件

f = open('file.txt', 'w', encoding='utf-8')
f.write('艾斯利\n')
f.write('alex')
f.flush()              #刷新,养成好习惯
f.close()

2、写模式二 (wb)
wb模式下,不用指定字符编码,但是写内容的时候必须将字符串转化成utf-8的bytes数据
文件不存在会创建文件

f = open('file.txt', 'wb')
f.write('艾斯利'.encode('utf-8'))       #写的时候需要指定encode('utf-8')
f.write('alex'.encode('utf-8'))
f.flush()
f.close()

三、追加模式

1、追加(a,a+,ab)
只要是a, a+ 或 ab 都是在文件的末尾追加内容,无论光标在哪里
a, a+ 需要指定encoding=‘utf-8’
ab 不需要指定字符编码,但是写的时候需要转换成encode(‘utf-8’)
文件不存在会创建文件

(1) a 模式
f = open('file.txt', 'a', encoding='utf-8')
f.write('王同志')
f.flush()
f.close()

(2) a+ 模式
f = open('file.txt', 'a+', encoding='utf-8')
f.write('王刚')
f.flush()
f.close()

(3) ab 模式
f = open('file.txt', 'ab')
f.write('王刚2'.encode('utf-8'))
f.flush()
f.close()

四、读写模式
1、读写模式(r+,r+b)
r+ 模式默认光标在开头,必须先读取,再写入,否则会把第一行内容替换掉
文件不存在会报错

(1) r+ 模式
f = open('file.txt', 'r+', encoding='utf-8')
f.read()                # 先读取,此时光标会移动到结尾
f.write('王刚')          # 再写入内容
f.flush()
f.seek(0)                # seek(0)表示把光标移到开头
print(f.read())          # 读取全部内容
f.close()
----------------------------------
111
222
33333
444王刚

(2) r+b 模式
f = open('file.txt', 'r+b')
f.read()
f.write('王某欧某'.encode('utf-8'))
f.flush()
f.seek(0)
print(f.read())
f.close()
---------------------------------
b'111\n222\n33333\n444\xe7\x8e\x8b\xe6\x9f\x90\xe6\xac\xa7\xe6\x9f\x90'

五、光标位置(太麻烦,用的少)

1、光标位置 seek()、teel()
seek(n) 光标移动到n位置,最常用的是移动到开头或结尾。
一个中文是3个光标,一个字母、一个数字和 \n 是一个光标
seek(0) 表示开头
seek(1) 表示当前位置
seek(0,2) 表示结尾

teel() 可以获取当前光标所在位置

(1) 光标位置
你好|             # 光标的位置是6
你还好|吗         # 光标的位置是9
123|456          # 光标的位置是3
aBcd|eFg         # 光标的位置是4
12a哈哈a|23      # 光标的位置是10

(2) 光标位置使用
f = open('file.txt', 'r+', encoding='utf-8')
print(f.tell())            # 查看光标位置
f.seek(0,2)                # 把光标移到结尾
print(f.tell())            # 再次查看光标位置
f.write('\n我是alex')      # 在末尾写点东西
f.flush()                  # 把写到内存中的内容刷新到文件
f.seek(0)                  # 把光标移动到开头
print(f.read())            # 从开头读取文件内容
f.close()                  # 关闭文件句柄

(3) 在指定光标后面添加'\nalex'
# 文件内容
"""
ABCD你
我来自
北京
"""
f = open('file.txt', 'r+', encoding='utf-8')
f.seek(11)         # 光标移动到11的位置(注意\n算一个),也就是 "我" 字后面
f.write('\nalex')  # 在“我”字后面添加内容(注意“我”字后面的“来自”会被删掉)
f.flush()          # 刷新
f.seek(0)          # 光标移动到开头
print(f.read())    # 读取文件内容
----------------------------------------
ABCD你
我
alex
北京

2、truncate() 截断文件
truncate() 表示删除光标之后的所有内容

# 文件内容
"""
ABCD你
我来自
北京
"""
f = open('file.txt', 'r+', encoding='utf-8')
f.seek(14)     # 光标移动到13的位置(注意\n算一个),也就是 "来" 字后面
f.truncate()   # 删除光标后所有内容
f.flush()      # 刷新
f.seek(0)      # 光标移动到开头
print(f.read())# 读取文件内容
----------------------------------
ABCD你
我来

六、with用法(常用)

1、with也可以操作文件,而且不需要close()
主要用于修改文件内容(重要):
将文件内容读取到内存,在内存中修改,修改完存入新的文件,并把旧文件删除,新文件改名为旧文件

(0) 基本用法
#!/usr/bin/env python
#coding:utf-8

#with打开文件并赋值给变量f2
with open('test2.txt','r') as f2:
    print(f2.readlines())
    
with open('file3','r+') as f1:
    f1.write('abcde')
    f1.seek(0)
    print(f1.readline())



(1) 把file.txt中的“oldboy” 改成 “ALEX”(重要)
import os
# 以只读的方式打开file.txt并交给变量f1, 以写的方式打开new_file.txt并交给变量f2
with open('file.txt','r',encoding='utf-8') as f1,\
    open('new_file.txt','w',encoding='utf-8') as f2:
    # 把file.txt的内容存入内存
    free = f1.read()
    # 在内存中修改file.txt的内容
    free = free.replace('oldboy','ALEX')
    # 把改好的内容存入新的文件new_file.txt中
    f2.write(free)
# 删除file.txt文件,并把new_file.txt文件重命名为file.txt
os.remove('file.txt')
os.rename('new_file.txt','file.txt')






(2) 读取文件内容为列表,并用if判断某个值是否在列表内
#user.txt文件内容
"""
alex
oldbooy
xiaozhang
"""
#输入用户名
name = input('please input your name:')

#读取user.txt文件内容,并将内容转换成列表
User = open('user.txt','r')
user = User.read().split()
User.close()

#判断输入的用户名是否在文件里面
if name in user:
    print('ok')
else:
    print('no')
    
    
    
(3) 对文件file.txt进行写操作并打印文件内容
#!/usr/bin/env python
#coding:utf-8
#第一种方法
with open('file.txt','r',encoding='utf-8') as f1,\
        open('file.txt','a',encoding='utf-8') as f2:
    f2.write('\nAlex')
    f2.flush()
    print(f1.read())
#第二种方法
with open('file.txt','r+', encoding='utf-8') as f1:
    f1.read()                     #光标移到结尾
    f1.write('\noldboy is 40')    #写入新内容
    f1.flush()                    #刷新
    f1.seek(0)                    #光标移到开头
    print(f1.read())              #读取文件内容
    
    
    
    
(4) 读取test.txt 的内容保存到test2.txt(就是拷贝操作)
#第一种方法
with open('test.txt','r') as f1, open('test2.txt','w') as f2:
    for i in f1.readlines():
        f2.write(i)
        print(i)
#第二种方法
f = open('file.txt', 'r', encoding='utf-8')
file1 = f.read()

f2 = open('file2.txt', 'w', encoding='utf-8')
f2.write(file1)
f2.flush()
f2.close()

f.close()

七、读取文件中的内容并写入字典(重要)

"""
1,苹果,5元,1000个
2,香蕉,3元,2000个
3,鸭梨,4元,5000个
"""
f = open('w.txt','r',encoding='utf-8')
lst = []
for line in f:
    line = line.strip().split(',')
    order = line[0]
    fruits = line[1]
    money = line[2]
    number = line[3]
    # 这里直接创建一个新字典,并把字典加入到列表中
    dic = {'序列':order, '水果':fruits, '价格':money, '数量':number}
    lst.append(dic)

f.close()
print(lst)
-------------------------------------------------
[
{'序列': '1', '水果': '苹果', '价格': '5元', '数量': '1000个'}, 
{'序列': '2', '水果': '香蕉', '价格': '3元', '数量': '2000个'}, 
{'序列': '3', '水果': '鸭梨', '价格': '4元', '数量': '5000个'}
]

八、获取用户名密码

(1) 用户名密码是字符串
"""
alex,123456
oldboy,123456
"""
with open('user.txt', mode='r', encoding='utf-8') as f:
    num = 0
    for i in f.readlines():
        num += 1
        if num == ‘alex':           # 如果读到’alex'行就显示内容
            a = i.split(',')
            user = a[0].strip()    # 用户名
            paswd = a[1].strip()   # 密码
            return user, paswd
            
(2) 用户名密码是字典 
"""
{'alex':'123456'}
{'oldboy':'123456'}
"""
with open('user.txt', mode='r', encoding='utf-8') as f:
    for i in f:
        if 'alex' in i:        # 如果是用户alex就打印
            print(i,type(i))   # 类型是str
            dic = eval(i)      # 转换回dict
            for i in dic:
                user = i
                passd = dic[i]
                print(user,passd)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

会飞的爱迪生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值