python中操作文件的介绍

打开文件

# 使用open函数来打开一个文件
# 参数:
#   file 要打开的文件的名字(路径)
# 返回值:
#   返回一个对象,这个对象就代表了当前打开的文件

在当前文件目录下创建一个demo.txt文件

hello world
china america russia
german it
# _*_ coding : utf-8 _*_
# @Time : 2023/6/17 17:19
# @Author : scx
# @File : open_file01
# @Project : test03
# 创建一个变量,来保存文件的名字
# 如果目标文件和当前文件在同一级目录下,则直接使用文件名即可
file_name = 'demo.txt'

# 在Windows系统使用路径时,可以使用/来代替\
# 或者可以使用 \\ 来代替 \
# 或者也可以使用原始字符串
file_name = 'hello/demo.txt'
file_name = 'hello\\demo.txt'
file_name = r'hello\demo.txt'  # 字符串前面加r后面的内容都不会被转义,保持原始字符串

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

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

file_obj = open(file_name)  # 打开 file_name 对应的文件

print(file_obj)

关闭文件

# _*_ coding : utf-8 _*_
# @Time : 2023/6/17 17:34
# @Author : scx
# @File : close_file02
# @Project : test03

# 打开文件
file_name = 'demo.txt'
# 调用open()来打开文件
file_obj = open(file_name)
# 当我们获取了文件对象以后,所有的文件的操作都应该通过对文件对象进行
# 读取文件中的内容
# 使用read()方法,用来读取文件中的内容,它会将内容全部保存到一个字符串中返回。
#    这种方法,会将读取的文件的所有内容一次性都先放到内存中,不适合读取大文件,会产生内存溢出
content = file_obj.read()
print(content)

# 关闭文件
# 为啥要对文件进行关闭
#   如果每次打开同一个文件都不进行关闭,那么就像在Windows系统下,通过鼠标打开一个文件,又对这个文件进行打开,会出现多个文件的窗口。
#       那么每个文件窗口都是占用内存的。所以这里的open()也是相同作用。打开后,不再操作了,要及时关闭。
#   但就我们这个程序来说,程序执行完也就自动释放了文件对象,文件也就自动关闭了。但是实际项目中,程序是不会停止的。所以文件的关闭需要调用方法来主动关闭。
# 调用close()方法来关闭文件
file_obj.close()

# 还可以使用 with ... as 语句
with open(file_name) as file_obj:
    # 在with语句中可以直接使用file_obj来做文佳操作
    # 此时这个文件只能在with中使用,一旦with结束则文件会自动close(),不用手动调用close了。
    print(file_obj.read())

# 对打开时可能出现的异常进行捕获
file_name = 'hello.txt'

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

简单读取

在当前文件夹下创建一个zhognwen.txt文件

锄禾日当午
汗滴禾下土
谁知盘中餐
粒粒皆辛苦
# _*_ coding : utf-8 _*_
# @Time : 2023/6/17 17:55
# @Author : scx
# @File : read_file01
# @Project : test03

# file_name = 'demo.txt'
file_name = 'zhongwen.txt'

try:
    # 调用open()来打开一个文件,可以将文件分成两种类型
    # 一种,是纯文本文件(使用utf-8等编码编写的文本文件 如:txt文件)
    # 一种,是二进制文件(图片、mp3、ppt、doc、dpf等文件)
    # open()打开文件时,默认是以文本文件的形式打开的,但是open()默认的编码为None,具体使用那个编码规则,取决于平台,如果是Windows,则是gbk
    #   如果我们的文件的编码规则是utf-8。而打开时必须指定编码规则,否则按照gbk编码规则打开文件时会产生乱码,在使用read()读取时匹配不到编码规则的字节时则报错。
    #   因为“ GBK:中文每个字符占用2个字节,英文1个字节 UTF-8:中文每个字符占用3个字节,英文1个字节”
    #   所以在纯英文中,不指定编码规则,也没事。但是中文文本时,就必须指定了。
    # 所以处理文本文件时,必须要指定文件的编码
    with open(file_name, encoding='utf-8') as file_obj:
        # 使用read()读取文件
        content = file_obj.read()
        print(content)
except FileNotFoundError:
    print(f'{
      
      file_name}不存在~~~')

读取大文件

在当前文件目录下创建bigFile.txt文件

hello world
china america russia
german it
lisi wangwu zhaoliu qianqi
zhaosi zhaoliu zhaosan
zhangsan xiaoqiang xiaogang
# _*_ coding : utf-8 _*_
# @Time : 2023/6/17 17:55
# @Author : scx
# @File : read_big_file
# @Project : test03

file_name = 'demo.txt'

try:
    with open(file_name, encoding='utf-8') as file_obj:
        # 通过read()读取文件中的内容
        # 如果直接调用read()它会将文本文件的所有内容都读取出来
        # 如果要读取的文件较大的话,会一次性将文件的内容加载到内存中,容易导致内存泄漏
        # 所以对于较大的文件,不要直接调用read()
        # help(file_obj.read) #read(size=-1, /)
        # read()可以接收一个size作为参数,该参数用来指定要读取的字符数量
        #   默认值为-1,它会读取文件中的所有字符
        #   可以为size指定一个值,这样read()会读取指定数量的字符,
        #       每一次读取都是从上次读取到位置开始读取的
        # content = file_obj.read(-1)
        content = file_obj.read(6)
        content = file_obj.read(6)
        content = file_obj.read(6)
        content = file_obj.read(6)

        # print(content)
        # print(len(content))  # 当size=-1时,可以打印文件的字符数量,包括换行符。当文件读取到结尾后,再读取文件返回的content是空串,len(content)的值则为0,
except FileNotFoundError:
    print(f'{
      
      file_name}不存在~~~')

# 读取大文件的方式
file_name = 'bigFile.txt'

try:
    with open(file_name', encoding='utf-8') as file_obj:
        # 定义一个变量,来保存文件内容
        file_content = ''
        # 定义一个变量,来指定每次读取的字符数量
        chunk = 100
        # 创建一个循环来读取文件的内容
        while True:
            content = file_obj.read(chunk)
            # 检查是否读取到了内容
            if not content:  # 因为当读取到文件最后时,再读取返回的content就是空串了,空串在 if 条件判断中是 False。
                # 内容读取完毕
                break  # 退出循环
            # 输出内容
            # print(content, end='')
            file_content += content
except FileNotFoundError:
    print(f'{
      
      file_name}不存在~~~')

print(file_content)

按行读取

# _*_ coding : utf-8 _*_
# @Time : 2023/6/17 19:30
# @Author : scx
# @File : readline01
# @Project : test03
import pprint

file_name = 'demo.txt'
with open(file_name, encoding='utf-8') as file_obj:
    # readline()
    # 该方法可以用来读取一行内容
    # print(file_obj.readline(), end='')
    # print(file_obj.readline())

    # readlines()
    # 该方法用于一行一行的读取内容,它会一次性读取到的内容封装到一个列表中返回
    # 列表中的每一个元素都以\n结尾
    r = file_obj.readlines()
    pprint.pprint(r[0])
    pprint.pprint(r[1])
    pprint.pprint(r[2])
    print(r)

    for item in r:
        print(item, end='')  # item中本身有一个换行符,这里的print默认也有一个换行符,所以这里设置end='',保留一个换行符

写入文件

# _*_ coding : utf-8 _*_
# @Time : 2023/6/18 10:42
# @Author : scx_link
# @File : write_file01
# @Project : FileTest

file_name = 'demo1.txt'

# 使用open()打开文件时必须要指定打开的文件所要做的操作(读、写、追加)
# 如果不指定操作类型,则默认是 读取文件,而读取文件时是不能向文件中写入的
# r 表示只读的 也是默认值
# w 表示是可写的,使用w来写入文件时,如果文件不存在会创建文件,如果文件存在则会截断文件
#   截断文件是指删除原来文件中的所有内容
# a 表示追加内容,如果文件不存在会创建文件,如果文件存在则会向文件中追加内容
# x 表示用来新建文件,如果文件不存在则创建,存在则报错
# + 表示为操作符增加功能
# r+ 即可读又可写,文件不存在会报错
# w+ 即可写又可读
# a+ 即可追加内容又可读
# with open(file_name, 'w', encoding='utf-8') as file_obj:
# with open(file_name, 'r+', encoding='utf-8') as file_obj:
with open(file_name, 'x', encoding='utf-8') as file_obj:
    # write()来向文件中写入内容,
    # 如果操作的是一个文本文件的话,则write()需要传入一个字符串作为参数
    # 该方法会可以分多次向文件中写入内容
    # 写入完成以后,该方法会返回写入的字符的个数
    file_obj.write('abcd\n')
    file_obj.write('efgh\n')
    file_obj.write('mnop\n')
    # file_obj.write(123) #会报错
    r = file_obj.write(str(123) + '123123\n')
    r = file_obj.write('今天天气真不错')
    print(r)
    # 上面的写的操作都是把内容先写到缓存区,并没有及时的落盘进入文件内容,所有直接使用print(file_obj.read())时看不到新内容。
    file_obj.flush()  # 从缓存区将内容强制输出到标准输出中或指定的文件中
    print(file_obj.read())

操作二进制文件

# _*_ coding : utf-8 _*_
# @Time : 2023/6/18 11:14
# @Author : scx_link
# @File : binary_file
# @Project : FileTest

file_name = 'video.wmv'
# 读取模式
# t 读取文本文件 (默认值)即 mode = 'r' 就是 mode = 'rt' 一个意思
# b 读取二进制文件 mode = 'rb' ,对应的写入模式 就是 mode = 'wb'

with open(file_name, 'rb') as file_obj:
    # 读取文本文件时,size 是以字符为单位的
    # 读取二进制文件时,size 是以字节为单位
    # print(file_obj.read(100)) # 读取100个字节

    # 将读取到的内容写出来
    # 定义一个新的文件
    newfile_name = 'new_video.wmv'
    with open(newfile_name, 'wb') as newfile_obj:
        # 定义一个变量,表示读取的字节数
        chunk = 1024 * 100  # 100K
        while True:
            # 读取指定字节数的大小的内容
            binary_content = file_obj.read(chunk)
            # 判断文件是否读取完毕
            if not binary_content:
                break
            # 将读取到的内容写入到指定文件中
            newfile_obj.write(binary_content)

seek()和tell()

# _*_ coding : utf-8 _*_
# @Time : 2023/6/18 11:39
# @Author : scx_link
# @File : read_fi
# le_postion
# @Project : FileTest

file_name = 'demo.txt'

with open(file_name, 'rb') as file_obj:
    # print(file_obj.read(100))
    # print(file_obj.read(30))

    # seek() 可以修改当前读取的位置
    # file_obj.seek(3)
    file_obj.seek(4, 1)
    # file_obj.seek(3, 1)
    # file_obj.seek(-10, 2)
    # seek() 需要两个参数
    #   第一个 是要切换到的位置,这个参数 单位是字节
    #   第二个 计算位置方式
    #       可选值
    #           0 从头计算,默认值
    #           1 从当前位置计算
    #           2 从最后位置开始计算

    print(file_obj.read(5))

    # tell() 方法用来查看当前读取的位置
    print('当前读取到了 -->', file_obj.tell())

对文件的其他操作

# _*_ coding : utf-8 _*_
# @Time : 2023/6/18 12:06
# @Author : scx_link
# @File : other_file_operator
# @Project : FileTest

import os
from pprint import pprint

# os.listdir() 获取指定目录的目录结构
# 需要一个路径作为参数,会获取到该路径下的目录结构,默认路径为 当前目录
# 该方法会返回一个列表,目录中的每一个文件(夹) 的名字都是列表中的一个元素
r = os.listdir()
print(r)

# os.getcwd() 获取当前所在的目录
r = os.getcwd()
print(r)

# os.chdir() 切换当前所在的目录到上一级目录 作用相当于 cd ..
# os.chdir('..')
# r = os.getcwd()
# print(r)

# 创建目录
# os.mkdir('aaa')  # 在当前目录下创建一个名字为aaa的目录

# 删除目录
# os.rmdir('abc')

# open('aaa.txt', 'w')

# 删除文件
# os.remove('aa.txt')

# os.rename('旧名字', '新名字')  # 可以对一个文件进行重命名,也可以用来移动一个文件
# 第一个参数和第二个参数的目录相同则是文件重命名,不同则是移动文件
# os.rename('demo.txt','123.txt')
os.rename('123.txt', 'aaa/demo.txt')

猜你喜欢

转载自blog.csdn.net/adminstate/article/details/131263983
今日推荐