python语言基础(十六)包、文件读写操作

每一个.py文件就被称为模块。之前创建文件夹是在python目录下,点右键选择 New—> Directory。在python中可以创建包,New—> Python Package,如设置包的名称为pack,会发现在包的里面自动生成了一个" __ init__ .py"的文件。
包是管理python模块命名空间的形式。在pack内创建test1.py 和test2.py

test1.py
def test1():
    print('test1 wenjian1')

def test2():
    print('test1 wenjian2')
test2.py
def test2():
    print('test2 wenjian1')


def test2():
    print('test2 wenjian2')

在pack的同级目录下创建 bao_test.py,去调用包里的模块。

bao_test.py
from pack import test1,test2
test1.test1()       # test1 wenjian1
test1.test2()       # test1 wenjian2

test2.test1()       # test2 wenjian1
test2.test2()       # test2 wenjian2

如果用 ‘*’ 全部导入的时候会报错,需要先在pack的" __ init__ .py"里进行__all__的设置,all是暴漏接口的意思,提供了哪些是公开接口的约定。如果想让外部访问到包里的模块,需要将模块主动暴漏。

__init__.py
__all__ = ['test1','test2']
bao_test.py
from pack import *
test1.test1()       # test1 wenjian1
test1.test2()       # test1 wenjian2

test2.test1()       # test2 wenjian1
test2.test2()       # test2 wenjian2

如果直接导入包,用包.模块.函数()的形式直接访问,会报错。 则需要在" __ init__ .py"里进行修改。

__ init__ .py
# . 代表当前文件的意思
from . import test1, test2
bao_test.py
import pack
pack.test1.test1()      # test1 wenjian1
pack.test2.test1()      # test2 wenjian1

文件读写操作

在实际操作中,通常需要将数据写入到本地文件或者从本地文件中读取数据等操作,就需要掌握用Python语言去对本地文件进行操作。
正常情况下操作文件的步骤是,新建文件 —> 打开 —> 写入内容 —> 关闭文件。
同样在python中操作本地文件操作步骤为:找到文件所在位置
—> 打开文件 —> 操作文件 —> 关闭文件

open()函数

open()函数语法
open(file, mode=‘r’,encoding=None) --> 打开文件

  • file --> 文件名字或者文件路径

  • mode --> 操作文件模式

    • r --> 只读模式
    • w --> 写入
    • a --> 追加
  • encoding --> 指定文件编码

    • utf-8 --> 当文件中文乱码时,则指定编码为utf-8解决。

只读模式 r

方法描述
f.readable()判断是否可读,返回值为布尔
f.read(n)默认读取全部,在python3中当n为数字时,n为读取的字符
f.readline()逐行读取,读取的每一行会自带一个换行符\n
f.readlines()读取所有,返回值为列表,包括\n
f.tell()文件指针所处文件位置
f.seek()改变指针所处的位置
f = open('text.txt','r',encoding='utf-8')  # 如果没有text.txt文件,会报错,FileNotFoundError
print(f.readable())     # True 判断文件是否可读,返回布尔值
print(f.read())    # 读取text中的全部内容,如果有中文,要指定编码为 utf-8,万国码
# print(f.read(6))    # n 为字符数,数字,\n,中文均为一个字符,unicode编码时候,一个汉字是3个字节
# 当 f.read()与f.read(n)同时存在的时,f.read()读取时,指针已经移动到最后一个字符处,再进行读取的时候就读不到了,返回空格。

print(f.tell())  # 用来查看当年文件指针所处的位置,用字节表示
print(f.readline(),end='')  # 逐行读取,操作不可逆,默认增加一个换行符
print(f.readline(),end='')  # 逐行读取,操作不可逆
print(f.tell())     # 字母数字代表一个字节,\n代表2个字节,汉字代表3个字节

print(f.readline())  # 括号里有limit参数,只能限制当前行的最大字符,如果超出,仍然只能读取当前行
print(f.readlines())   # 读取所有的内容,以列表的形式展示,更容易操作。
#括号里的参数 hint,超过第一行字符的个数,就会获取第二行。可以用f.readlines()[索引]获取第一行的内容
'''去掉读取每一行后的\n'''

res = f.readlines()
for i in range(len(res)):
    res[i] = res[i].rstrip('\n')  # 在元素右边去掉   
print(res)

'''
# offset: 偏移量
# whence: 0(默认值,默认从头开始),1(指的是当前指针的位置),2(指的是文件末尾)
print(f.tell())  # 0
f.seek(5,0)
print(f.tell())  # 5
'''

注意

  • r模式,当文件不存在时则报错
  • f.read() --> 读取全部,返回原本的信息
  • f.readline() -->逐行读取
  • f.readlines() -->读取全部,且为列表,经常使用
  • 读取不可逆,从上至下读取,跟指针位置有关

只写模式 w

方法描述
f.writable()判断是否可写
f.write(str)写入内容,返回值为写入字符串的长度,只能写入字符串
f.writelines(seq)写入多行,但需要自己添加换行符
f = open('text01.txt', 'w', encoding='utf8')  # 当text01.txt不存在时,不会报错,会创建文件
print(f.readable())     # False 只写模式就是写入,不能读
print(f.writable())     # True 可以写入
# f.write('hello world')  # 在text01中写入 hello world
# print(f.write('hello world'))  # 在写入的同时,有返回值,为字符串的长度 11
f.write('你好')    # 再次写入,分两次运行的时候会进行内容的覆盖

f.writelines(['第一行\n', '第二行\n'])  # 如果没有\n,列表中的元素都会在一行

注意

  • w模式,当文件不存在时创建文件
  • 再次写入为覆盖

追加模式 a

f = open('text02.txt', 'a', encoding='utf-8')  # 文件不存在时 会自动创建
# f.write('hello worle')
f.write('天气真好')  # 再次写入为追加

注意

  • a模式,当文件不存在时创建文件
  • 再次写入为追加
r+,w+,a+模式
f = open('text.txt', 'r+', encoding='utf-8')  # r+,以r(读)为主导,不会创建新文件
# print(f.read())
f.write('大家好') # r+为可读可写模式,可以写入但并未完全覆盖之前的内容,

f = open('text03.txt', 'w+', encoding='utf-8') # 文件不存在,创建新文件
# 可写可读模式,可读但是读不出来内容,以w模式为主,a+同理
# f.write('hello world')
print(f.readable())     # True 可读的
print(f.read())   # 读不出来内容,运行后都会清空文件

Python操作二进制 wb

wb模式
b = b'hello worle'
print(type(b))    # <class 'bytes'>  字节类型
f = open('text04.txt', 'wb') # 文件不存在会创建,w模式下write只能写入字符串,
# wb可以写入二进制模式,字节、音频、视频、图片都是二进制
f.write(b)

Python操作json文件

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

json格式:'{"key":"value"}'

json.loads()            -->  json转为字典(适用于语句)
json.dumps()         -->  字典转为json(适用于语句)
json.load()             -->  json转为字典(适用于文件)
json.dump()           -->  字典转为json(适用于文件)
import json
data = {'name':'xiaoming'}  # 字典
写入json文件
f = open('data.json','w')
# f.write(data)  # 会报错,w模式下只能传入字符串
json.dump(data, f)  # 创建data.json,并在里写入{"name": "xiaoming"},json类型的数据
# 第一个参数为数据,第二个参数为文件对象

读取json文件的内容
import json
f = open('data.json', 'r')
# print(f.read(), type(f.read()))  #  不用此方法
# {"name": "xiaoming"} <class 'str'> 读取出来的是字符串的类型

# 可以直接讲json对象转为python对象
j_data = json.load(f)
print(j_data,type(j_data))
# {'name': 'xiaoming'} <class 'dict'>
print(j_data['name'])   # xiaoming

f.close()

要注意的是,当文件打开之后,必须通过f.close()语句来关闭文件,释放资源,如果操作大型文件需要执行很长时间,未关闭的话,很容易造成程序崩溃或出现问题。

import time
f = open('text02.txt', 'w')
f.write('hello world')
time.sleep(5)
f.close() # 当程序执行完毕,才会把需要写入的内容载入到硬盘中
# 如果没有关闭,会一直停留在内存中,关闭后才会真实写入硬盘
# 可以用try去捕获错误
try:
    f = open('text02.txt', 'w') # 如果在r模式下进行写入,程序发生异常,就不会关闭文件
    f.write('hello world')
except:
    pass
finally:
    if f:
        f.close() # 放在finally里,尽管程序出错,也会执行关闭文件的操作

with open()

with open() --> 上下文管理器
with关键字用于Python的上下文管理器机制。为了防止诸如open这一类文件打开方法在操作过程出现异常或错误,或者最后忘了执行close方法,文件非正常关闭等可能导致文件泄露、破坏的问题 。Python提供了with这个上下文管理器机制,保证文件会被正常关闭。在它的管理下,不需要再写close语句。其余操作都同open()一致。
with语句会自动触发__exit__(),关闭文件,则不需要f.close语句。

with open('text05.txt', 'w') as f:
    f.write('aaa')  # 自动创建文件并进行写入,且不用单独关闭
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值