python之文件操作

文件操作:对磁盘数据的读写操作
读写操作:read write
IO操作:inputstream字节输入流 outstream字节输出流

打开文件

open(file, mode='r', buffering=-1, encoding_=None, errors=None, newline=None, closefd=True, opener=None)

  • 使用open函数来打开一个文件返回对应的 file object。如果该文件不能打开,则触发 OSError。
open()参数讲解

①file 要打开的文件的名字(路径)
返回值: 返回一个对象,这个对象就代表了当前打开的文件
②mode 用于指定打开文件的模式,mode 参数是可选的;省略时默认为 ‘r’。

参数值含义
‘r’表示文件只能读取。
‘w’表示只能写入(已存在的同名文件会被删除)。
‘a’表示打开文件以追加内容;任何写入的数据会自动添加到文件的末尾。
‘r+’表示打开文件进行读写。
‘b’二进制模式
‘t’文本模式(默认)
‘x’排它性创建,如果文件已存在则失败

③ buffering 可选的整数,用于设置缓冲策略。

参数值含义
0以切换缓冲关闭(仅允许在二进制模式下)
1选择行缓冲(仅在文本模式下可用)
>1的整数以指示固定大小的块缓冲区的大小(以字节为单位)

④encoding 是用于解码或编码文件的编码的名称。只在文本模式下使用。
⑤errors 可选的字符串参数,用于指定如何处理编码和解码错误 - 这不能在二进制模式下使用。
⑥ewline 控制 universal newlines 模式如何生效(它仅适用于文本模式)。
它可以是 None,’’,’\n’,’\r’ 和 ‘\r\n’。
⑦closefd 是 False 并且给出了文件描述符而不是文件名,那么当文件关闭时,底层文件描述符将保持打开状态。
如果给出文件名则 closefd 必须为 True (默认值),否则将引发错误。
⑧opener 通过传递可调用的 opener 来使用自定义开启器。然后通过使用参数( file,flags )调用 opener 获得文件对象的基础文件描述符。opener 必须返回一个打开的文件描述符。

文件分类

调用open()来打开一个文件,可以将文件分成两种类型

  • 纯文本文件(使用utf-8等编码编写的文本文件)
  • 二进制文件(图片、mp3、ppt等这些文件)

open()打开文件时,默认是以文本文件的形式打开的,但是open()默认的编码为None。所以处理文本文件时,必须要指定文件的编码。常见编码有GBK 、GB2312 、UTF-8 、ASCII

file_name = 'demo.txt'

try:
    with open(file_name,encoding='UTF-8') as file_obj :
        print(file_obj.read())
except FileNotFoundError:
    print(f'{file_name} 文件不存在~~')
路径规范
  • 如果目标文件和当前文件在同一级目录下,则直接使用文件名即可
  • 在windows系统使用路径时,可以使用/来代替 \ 。或者可以使用 \ 来代替 \。或者也可以使用原始字符串
  • 使用…来返回一级目录
  • 如果目标文件距离当前文件比较远,此时可以使用绝对路径。绝对路径应该从磁盘的根目录开始书写
创建一个变量,来保存文件的名字
如果目标文件和当前文件在同一级目录下,则直接使用文件名即可
file_name = '0716.py'
file_obj = open(file_name)
print(file_obj)

# 在windows系统使用路径时,可以使用/来代替 \
# 或者可以使用 \\ 来代替 \
# 或者也可以使用原始字符串
file_name = 'hello\\demo.txt'
file_name = r'hello\demo.txt'
file_obj = open(file_name)
print(file_obj)

# 表示路径,可以使用..来返回一级目录
file_name = '../hello/demo.txt'
file_obj = open(file_name)
print(file_obj)

# 如果目标文件距离当前文件比较远,此时可以使用绝对路径
# 绝对路径应该从磁盘的根目录开始书写
file_name = r'C:\Users\Desktop\hello.txt'
file_obj = open(file_name) # 打开 file_name 对应的文件
print(file_obj)

读取文件

  • 直接使用read()
    read()方法,用来读取文件中的内容,它会将内容全部保存为一个字符串返回
# 打开文件

file_name = 'demo.txt'

# 调用open()来打开文件

file_obj = open(file_name)

# 当我们获取了文件对象以后,所有的对文件的操作都应该通过对象来进行读取文件中的内容
# read()方法,用来读取文件中的内容,它会将内容全部保存为一个字符串返回

content = file_obj.read()
print(content)

通过read读取文件的时候,机制效率不是很好。他可以将文件里面所有内容读取,如果有海量数据、大数据 不能直接调用
强制使用会造成数据发送阻塞 数据泄露 损失数据完整,违背数据事物的原子性粒子性等

  • read(size)
    read()可以接收一个size作为参数,该参数用来指定要读取的字符的数量。默认值为-1,它会读取文件中的所有字符
    • 每一次读取都是从上次读取到位置开始读取的
    • 如果字符的数量小于size,则会读取剩余所有的
    • 如果已经读取到了文件的最后了,则会返回’'空串
 file_name = 'demo.txt'
with open(file_name,encoding='utf-8') as file_obj:
    #content = file_obj.read(-1)  # 返回全部数据
    content1 = file_obj.read(17)   # 返回前17条数据
# print(content)
# print(len(content))  # 28

print(content1)
  • 读取大文件
    定义一个变量chunk
# 读取大文件的方式

file_name = 'demo.txt'

try:
    with open(file_name,encoding='utf-8') as file_obj:
        # 定义一个变量,来保存文件的内容
        file_content = ''
        # 定义一个变量,来指定每次读取的大小
        chunk = 100
        # 创建一个循环来读取文件内容
        while True:
            # 读取chunk大小的内容
            content = file_obj.read(chunk)

            # 检查是否读取到了内容
            if not content:
                # 内容读取完毕,退出循环
                break

            # 输出内容

            file_content += content
            print(file_content)
            print(content, end='')   # 两个输出等价

except FileNotFoundError :
    print(f'{file_name} 这个文件不存在!')

  • readline() 、readlines()
    readline()该方法可以用来读取一行内容
    readlines() 该方法用于一行一行的读取内容,它会一次性将读取到的内容封装到一个列表中返回
import pprint
import os
file_name = 'demo.txt'

with open(file_name , encoding='utf-8') as file_obj:

    print(file_obj.readline(),end='')
    print(file_obj.readline())
    print(file_obj.readline())
    
    r = file_obj.readlines()
    print(r) # ['1\n', '2\n', '3\n', '4\n', '\n', '你好\n', '我好\n']
    pprint.pprint(r[0])
    
    for t in file_obj:
        print(t)
        # 1
        #
        #  2
        #
        #  3
        #
        #  4
        #
        #
        #
        #  你好
        #
        #  我好

写入文件

给指定文件写入内容,如果源文件内有内容则删除,若内容与新内容相同,覆盖。它也支持类型转换的语法操作。

file_name = 'demo.txt'
with open(file_name,encoding='utf-8') as file_obj:
    # 对文件进行读写操作
    file_obj.write('张涛最帅!!!')  # io.UnsupportedOperation: not writable

发现无法写入,原因是open函数中的mode参数值未修改。

file_name = 'demo.txt'
with open(file_name,'w',encoding='utf-8') as file_obj:
    # 对文件进行写操作  w
    file_obj.write('张涛最帅!!!\n')
    file_obj.write('1234\n')

with open(file_name,'a',encoding='utf-8') as file_obj:
	 # 对文件进行追加内容操作  a
    file_obj.write('张涛最帅!!!\n')
    file_obj.write('1234\n')

with open(file_name,'x',encoding='utf-8') as file_obj:
	# 对文件进行排它性创建,如果文件已存在则失败
    file_obj.write('张涛最帅!!!\n')
    file_obj.write('1234\n')

with open(file_name,'r+',encoding='utf-8') as file_obj:
	# 打开文件进行读写
    file_obj.write('张\n')
    file_obj.write('121\n')

关闭文件

  • close()方法,用来关闭读取的文件。不关闭文件容易造成数据泄露

jdbc关闭次数:4次 collection statement resultset class.forname 操作四次麻烦
如何解决:大学:jdbcutils 企业:c3p0 jndi datasource–mybatis
利用以上进行资源操作,资源肯定不会泄露,服务器读取快,性能较高,安全。

file_name = 'demo.txt'

file_obj = open(file_name)

content = file_obj.read()
print(content)
file_obj.close() # 文件已关闭

content1 = file_obj.read()
print('关闭',content1)  # I/O operation on closed file.  已经打不开
  • 多次关闭文件with open(file_name) as file_obj:

面对需要频繁close的时候 用 with as
在with语句中可以直接使用file_obj来做文件操作
此时这个文件只能在with中使用,一旦with结束则文件会自动close()

file_name = 'demo.txt'
with open(file_name) as file_obj:
    print(file_obj.read())  # 执行完后自动close
content1 = file_obj.read()
print('关闭',content1)  # I/O operation on closed file.

异常操作 try: except:

程序读取不到文件时属于什么异常? i/o异常
原因:

  • 程序在读取过程中,肯定有找不到的情况 FindNotFoundError
  • 变量没有赋值,io操作里有很多不可控因素
file_name = 'hello'

try:
    with open(file_name) as file_obj :
        print(file_obj.read())
except FileNotFoundError:
    print(f'{file_name} 文件不存在~~')

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值