XX学Python·文件

文件基本操作

  • 文件打开的格式:
    • file1 = open(文件路径,读写模式),使用open函数。会返回一个文件对象。
      • 文件路径:可以写相对路径,也可以写绝对路径。路径需要以字符串形式传入。
      • 读写模式:r(读取) w(写入) a(追加)
      • open默认打开模式是r 模式,多用于打开文本类型的文件
  • 文件打开后,必须关闭,否则持续消耗服务器性能。
# 格式: open(file_name(文件路径), mode(读写模式)) 使用该函数会返回一个文件对象
file1 = open('python.txt', 'r', encoding='utf-8')
print(file1)  # <_io.TextIOWrapper name='python.txt' mode='r' encoding='utf-8'>
print(type(file1))  # <class '_io.TextIOWrapper'>
print(file1.read())  # 我会长成一棵大树,等你赞一声良木
# 若报错UnicodeDecodeError,打开文件编码方式encoding='utf-8'或encoding='utf-8-sig'
file1.close()  # 关闭文件后,即文件的连接状态消失了,但文件对象没发生改变
print(file1)  # 所以这句任然能执行,结果和前面同,但file对象不能进行任何读写操作,因已无法连接文件
print(file1.read())  # ValueError: I/O operation on closed file.已经关闭的文件

文件的读取

  • read()格式:文件对象.read(num)
    • num表示要从文件中读取的数据长度(单位:字符),若没有传入num,就表示读取文件中所有数据。
    • 最大读取字符一般限定为1024*1024(约1兆,若utf-8读取汉字就是约3兆)
    • 如果读取的文件不存在则直接报错
file1 = open('python.txt', 'r', encoding='utf-8')

# 文件每一次读取,都会持续向后读取,直到文件关闭或程序结束,所以可以使用循环进行读取
# 在所有文件内容读取完成后,会持续返回空字符串("")
while True:
    content = file1.read(4)
    if content == '':
        break
    print(content)
file1.close()
'''
我会长成
一棵大树

等你赞
一声良木
'''
  • readline: 每次读取一行,以\n为分隔符,在一个文件开启后,多次执行读取操作会持续向后读取,如果字符全部被读取完成,则返回空字符串。
  • readlines:一次性将文件全部读取,读取后,将文字以一行为一个元素保存到列表当中进行返回。
file1 = open('python.txt', 'r', encoding='utf-8')
while True:
    content = file1.readline()
    if content == '':
        break
    print(content, end='')
file1.close()
'''
我会长成一棵大树
等你赞一声良木
风轻云淡
坐看云卷云舒
'''
file1 = open('python.txt', 'r', encoding='utf-8')
content = file1.readlines()
print(content)
# ['我会长成一棵大树\n', '等你赞一声良木\n', '风轻云淡\n', '坐看云卷云舒']
file1.close()

文件的写入

  • 使用写入模式‘w’打开文件
    • 如果文件存在,则清空源数据
    • 如果文件不存在,则新建文件,不会报错
  • 使用write可以写入字符
  • 在windows电脑中书写文件读写时,需要使用encoding进行编码格式指定
    • 格式:open(文件路径, 读写模式, encoding = 编码格式)
file1 = open('test.txt', 'w')
file1.close()  # 文件不存在,新建了一个文件test.txt,没有报错

# 如果被打开的文件存在,则会将源文件内的字符清空
# 如果使用windows电脑进行开发,在写入文件时,需要制定编码格式为'utf-8'
# 如果使用linux或者mac默认是utf-8编码,不需要转码
file2 = open('python.txt', 'w', encoding='utf-8')
# file2.write('我爱中国')
# 如果写入的字符串是三对引号包过内部的换行符会不会写入呢?  会写入格式
file2.write('''
我爱北京天安门,
天安门上太阳升。''')
file2.close()

# writelines是配合readlines进行使用的,可将由字符串元素组成的列表一次性写入文件
file3 = open('test.txt', 'w', encoding='utf-8')
lines = ['吴丝蜀桐张高秋\n', '空山凝云颓不流\n', '举头望明月\n', '低头思故乡\n']
file3.writelines(lines)
file3.close()

# 文件读写都有一个游标来操作。因为第二次写后游标在最后,后面没有内容,所以返回空字符串
f = open("1.txt",'w+')
f.write("hello ")
f.write("China!")
d = f.read()
print(d)  # 结果打印空字符串
f.close()

文件的追加

  • ‘a’:模式下进行文件打开
    • 如果文件不存在,则创建新文件
    • 如果文件存在,则在原有文件内进行字符串追加,不会清空源文件
  • 在追加模式下,也使用write进行文件写入,没有单独追加方法,写入方式和‘w’模式一致
file = open('bigdata.txt', 'a', encoding='utf-8')
# 进行追加操作(注意:没有append方法,追加操作也是使用write进行写入,只是不会清空源文件)
file.write('乱我心者今日之日多烦忧')
# 关闭文件
file.close()

文件读写模式拓展(能明白意思即可)

  • a: a a+ ab ab+

    • a:字符追加模式
    • a+ :字符追加模式下可以进行字符读取
    • ab:字节追加
    • ab+:字节追加模式下,可以进行字节读取
  • w: w w+ wb wb+

    • w:字符写入模式
    • w+:字符写入模式下可以进行字符读取
    • wb:字节写入模式
    • wb+:字节写入模式下,可以进行字节读取
  • r: r r+ rb rb+

    • r:字符读取模式,文件的指针将会放在文件的开头。这是默认模式。
    • r+:字符读取模式下可以进行字符写入
    • rb:字节读取模式,比如读取图片
    • rb+:字节读取模式下,可以进行字节写入

文件备份案例

# 1.获取用户键入的文件名
file_name = input('请输入您要备份的文件名称:')
old_file = open(file_name, 'r', encoding='utf-8')

# 2.要通过文件读写操作进行备份
#   2.1.拼接备份后的文件的文件名
copy_file_name = file_name.replace('.', '[备份].')
# copy_file = open(copy_file_name, 'w')
# 在一次打开过程中,用w模式,多次写入,可以继续写入,但在下次打开该文件将会情况
copy_file = open(copy_file_name, 'a', encoding='utf-8')  # 最好用追加模式

#   2.2.读取源文件
while True:
    content = old_file.read(3)
    if content == '':
        break
    copy_file.write(content)  # 写入新文件

# 关闭文件
old_file.close()
copy_file.close()

文件和文件夹的操作

文件的重命名和删除

  • rename可以进行文件的重命名或文件移动
  • remove 可以进行文件删除
import os  # 导入os模块
# os.rename('1.txt', 'hc.txt')  # 将文件1.txt重命名为hc.txt
# os.rename('test.txt', 'D_test1/test')  # 文件可通过rename进行移动,路径须存在
# os.rename('hc.txt', 'D_test1/acn')  # 文件移动的同时进行改名

# remove删除文件不会有任何提示,也不会出现在回收站中,误删后无法回复,删除需谨慎
# os.remove('test[备份].txt')
os.remove('D_test1/acn')  # 删除指定目录下的文件

文件夹的操作

  • mkdir:创建一个空文件夹,不能创建多级文件夹
    • os.makedirs('aaa/bbb/ccc')创建多级目录
  • rmdir:删除空文件夹,不能删除有文件的文件夹,removedirs删除多级空目录
  • getcwd:获取当前使用的工作目录的路径
  • chdir:切换当前的工作目录
  • listdir:查询指定的目录结构,将该目录下所有文件名以字符串形式保存在列表中返回
    • 括号内不填写任何内容则为查询工作目录的目录结构
    • 如果填写路径,则是对指定目录的查询
import os
# mkdir创建文件夹
# os.mkdir('student')  # 创建文件夹student
# os.mkdir('student/class1')  #在student文件夹里创建文件夹class1,上级目录必存在
# 若上级目录不存在,要创建多级目录用os.makedirs()
os.makedirs('aaa/bbb/ccc') # 创建多级目录

# rmdir删除空文件夹
# os.rmdir('student')  # 报错,如果文件夹非空,不能用rmdir删除,需要递归删除
# os.rmdir('student/class1')  # 上级目录必须存在
os.removedirs('aaa/bbb/ccc') # 删除多级空目录

# getcwd获取当前使用的工作目录的路径 >> 类似于linux中的pwd
# 默认工作目录就是我们工程所在的根目录
# print(os.getcwd())  # C:\Users\.......\Pythonbase

# chdir切换工作目录 >> 类似于linux中的cd
# os.chdir('student')
# print(os.getcwd())  # C:\Users\......\Pythonbase\student

# listdir指定目录下的目录结构 >> 类似于linux命令中的ls
# print(os.listdir())  # 默认获取当前使用路径下是文件
# ['00python体验.py', '00python创建新文件', '01ss.py', '1[备份].txt', '3练习.py', 'D_test1', 'python.txt', 'student']
# os.chdir('D_test1')
# print(os.listdir())  # ['test']
print(os.listdir('D_test1'))  # 获取指定目录下的文件信息['test']

批量修改文件名案例

# 需求:批量修改指定目录下所有文件的文件名
'''
1.修改时可以通过参数控制是增加,还是删除字符
2.传入指定字符用于增加或者删除
3.使用rename进行重命名
'''

# 导入os模块
import os

# 定义一个控制增加还是删除的变量,True是增加 False 是删除
flag = False
# 指定字符的定义
str1 = '[黑马出品]'

# # 构造多个文件:在student目录下构造 test1-test10 十个文件
# for i in range(1, 11):
#     open('student/test' + str(i), 'w')


# 定义函数
def modify_files_name(flag, str1, path):
    os.chdir(path)  # 切换工作目录为指定的目录path
    for file_name in os.listdir():  # 遍历指定路径下所有文件名称
        if flag:
            # 重命名添加文件前缀
            os.rename(file_name, str1 + file_name)
        else:
            # 重命名删除文件名中指定的字符
            os.rename(file_name, file_name.replace(str1, ''))


# 将文件目录下所有的文件添加[黑马出品]的前缀
# modify_files_name(flag, str1, 'student')  # 前面的flag = True
modify_files_name(flag, str1, 'student')  # flag = False
posted @ 2022-10-04 22:56  PORTB  阅读(61)  评论(0编辑  收藏  举报