一、文件

文件基本操作:打开、关闭、读、写、复制等

文件操作作用:读取内容、写入内容和备份内容等,把数据内容存放起来,让程序下一次执行时能直接使用,而不必重新制作一份

二、文件操作步骤

2.1 打开文件

  • open(name,mode):打开一个已存在的文件,若不存在,则创建一个新文件
  • name:要打开的目标文件名的字符串(可包含文件所在的具体位置)
  • mode:设置打开文件的访问模式,如只读、写入、追加等

打开文件模式

  • r:只读方式打开,文件指针会放在文件开头(默认模式)
  • rb:以二进制格式打开一个文件用于只读,指针放开头
  • r+:打开一个文件用于读写,指针放开头
  • rb+:以二进制格式打开一个文件用于读写,指针放开头
  • w:打开一个已存在文件用于只写入,将原有内容删除,即从头编辑,若不存在,则创建新文件
  • wb:以二进制格式打开一个已存在文件用于只写入,从头编辑,若不存在则创建新文件
  • w+:打开一个已存在文件用于读写,从头编辑,若不存在则创建新文件
  • wb+:以二进制格式打开一个已存在文件用于读写,从头编辑,若不存在则创建新文件
  • a:打开一个已存在文件用于追加,指针放结尾,即新内容写入已有内容之后,若不存在则创建新文件写入
  • ab:以二进制格式打开一个已存在文件用于追加,指针放结尾,即新内容写入已有内容之后,若不存在则创建新文件写入
  • a+:打开一个已存在文件用于追加,指针放结尾,若不存在则创建新文件用于读写
  • ab+:以二进制格式打开一个已存在文件用于追加,指针放结尾,若不存在则创建新文件用于读写

 2.2 文件对象方法

  • 创建文件对象f:f = open('文件名','访问模式')
  • 写:文件对象.write('内容'),返回写入的字符数
  • 文件对象.read(size):size为读取长度大小,省略则读取文件中所有数据
  • 文件对象.readline():一次读取一整行内容,包括'\n',返回空字符串则表示已读取至最后一行
  • 文件对象.readlines():按照行的方式一次性读取整个文件内容,并返回一个列表,一行为一个列表元素
  • 文件对象.tell():返回文件对象当前所处位置,是从文件开头算起的字符数
  • 文件对象.seek(偏移量,起始位置):改变文件指针当前位置,返回指针移动后的位置
  • 偏移量:可正可负,正为向前移,负为向后移
  • 起始位置:0为开头,1为当前位置,2为结尾
  • 关闭:文件对象.close()
  • 文件备份
f = open('file.txt', 'w')
str = f.write('Hello World!\nHello China!\nHello JXUST!\nHello XX!')
print(str)
f = open('file.txt', 'r')
print(f.read(20), len('\n'), f.tell())   # 读取文件中前20个字符,'\n'占一位,指针移至第20个字符后,即C之后
print(f.readline(), f.tell())   # 从上一位置C之后继续读取一行,此处为该行的剩余数据
print(f.readlines(), f.tell())   # 从上一位置继续读取所有剩余行
f.close()
f = open('file.txt', 'rb+')
print(f'移动前位置:{f.tell()},移动后:{f.seek(3, 1)},移动后位置:{f.tell()}')
f.close()

输出:
48
Hello World!
Hello C 1 21
hina!
 28
['Hello JXUST!\n', 'Hello XX!'] 51
移动前位置:0,移动后:3,移动后位置:3

-----------------------------------------------------------------------------------------
f = open('file.txt', 'r')
print(f.readline(2))   # 读取行内指定长度数据,即前2个字符
print(f.readline())   # 读取上一位置之后该行的剩余字符
f.close()
f = open('file.txt', 'r')
print(f.readlines(20))   # 读取指定长度数据,按行分割,第20个字符在第二行范围内,故读取前两行
f.close()

输出:
He
llo World!

['Hello World!\n', 'Hello China!\n']

-----------------------------------------------------------------------------------------
print('--------文件备份--------')
old_file_name = input('输入要备份的文件名:')
index = old_file_name.rfind('.')   # 获取输入的文件名中.的索引下标
print(index, old_file_name[:index])
new_file_name = old_file_name[:index] + '(备份)' + old_file_name[index:]  # 构建新文件名
print(new_file_name)
old_file = open(old_file_name, 'rb')
new_file = open(new_file_name, 'wb')
while True:
    text = old_file.read()   # 读取要备份的文件中的数据
    print(len(text))
    if len(text) == 0:
        print('文件为空!')
        break
    new_file.write(text)   # 将数据写入备份的新文件
    break
old_file.close()
new_file.close()

输出:
--------文件备份--------
输入要备份的文件名:file.txt
4 file
file(备份).txt
51

2.3 文件和文件夹的操作

  • 文件重命名:os.rename(目标文件名,新文件名)
  • 文件删除:os.remove(目标文件名)
  • 创建文件夹:os.mkdir(文件夹名)
  • 删除文件夹:os.rmdir(文件夹名)
  • 获取当前目录:os.getcwd()
  • 改变默认目录:os.chdir(目录)
  • 获取目录列表:os.listdir(目录)

2.4 批量修改文件名

print('---------文件和文件夹操作----------')
import os  # 导入os模块
# 使用:os.函数名()
# os.rename('file(备份).txt', 'file[备份].txt')
# os.remove('file1.txt')
# os.mkdir('文件夹')
# os.rmdir('文件夹')
# print(os.getcwd())
# os.chdir('目录')
# print(os.listdir('面向对象'))

print('-------批量修改文件名-------')
flag = 1
dir = './文件夹/'
file_list = os.listdir(dir)
print(file_list)
for name in file_list:
    if flag == 1:
        new_name = 'File-' + name   # 为该目录下所有文件重命名为File-加原文件名
    elif flag == 2:
        new_name = name[len('File-'):]   # 为所有文件去除File-
    print(new_name)
    os.rename(dir + name, dir +new_name)