文件备份与重命名

# 2种方式打开文件、备份文件、import os# 打开文件class FileOpen:
    @staticmethoddef file_open1(file):
        fp = open(file, "w+", encoding="utf-8")# 无需flush,因为close自带flush,with open自带close# fp.flush()        fp.close()

    @staticmethoddef file_open2(file):
        with open(file, 'w+', encoding='utf-8') as f:
            data = f.readlines()# 无需close,因为with背后是上下文管理器自带close。# 备份class FileBackup:
    @staticmethoddef backups(old_name):
        index = old_name.rfind('.')# 提取后缀,index是.的位置数postfix = old_name[index:] if index > 0 else ""new_name = old_name[:index] + '[备份]' + postfix
        old_f = open(old_name, 'rb')
        new_f = open(new_name, 'wb')while True:
            con = old_f.read(1024)if len(con) == 0:breaknew_f.write(con)
        old_f.close()
        new_f.close()class BatchRename:# 固定名开头    @staticmethoddef batch_rename(flag=1):
        file_list = os.listdir()print(file_list)for i in file_list:# flag=1重命名0取消重命名(只有重命名完才能取消,直接取消是犯罪!!)new_name = 'Python_' + i if flag == 1 else i[len('Python_'):]
            os.rename(i, new_name)# 顺序的数字开头    @staticmethoddef rename_(flag=1):
        file_list = os.listdir()if flag == 1:for i, j in zip(file_list, range(1, 6)):
                new_name = str(j) + "." + i
                os.rename(i, new_name)else:for i in file_list:
                new_name = i[2:]
                os.rename(i, new_name)# 前缀换成罗马数字    @staticmethoddef rename2_(flag=1):
        file_list = os.listdir()
        file_list.sort(key=lambda x: int(x[:1]))  # 默认就是根据第一位排序,后面是负数则倒数排序print(file_list)
        prefix = ['I_', 'II_', 'III_', 'IV_', 'V_', 'VI_', 'VII_', 'VIII_', 'IX_', 'X_']if flag == 1:for i, j in zip(file_list, prefix):
                new_name = j + i[2:]
                os.rename(i, new_name)  # 改哪个路径就放哪个路径下。else:for i in file_list:
                new_name = i[2:]
                os.rename(i, new_name)# 前缀用英文代替罗马数字:先按照prefix里的顺序排序,再切割。    @staticmethoddef rename3_(flag=1):
        file_list = os.listdir()
        prefix = ['I_', 'II_', 'III_', 'IV_', 'V_', 'VI_', 'VII_', 'VIII_', 'IX_', 'X_']
        new_order = []# 1.构造顺序。犯下的错:1.用zip,zip是一一对应的,这里得用双循环;2.i,j顺序反了导致和原列表一致。我真是个天才。for j in prefix:for i in file_list:if i.startswith(j):
                    new_order.append(i)# 2.去掉原来的前缀用新的前缀char_list = [chr(i) for i in range(ord("a"), ord("z"))]for n, c in zip(new_order, char_list):
            index = n.find("_")
            new_name = c + n[index:]
            os.rename(n, new_name)if __name__ == '__main__':
    FileBackup.backups("test.txt")

批量重命名

# 批量重命名import os# 固定名开头def batch_rename(flag=1):
    file_list = os.listdir()print(file_list)for i in file_list:# flag=1重命名0取消重命名(只有重命名完才能取消,直接取消是犯罪!!)new_name = 'Python_' + i if flag == 1 else i[len('Python_'):]
        os.rename(i, new_name)# 顺序的数字开头def rename_(flag=1):
    file_list = os.listdir()if flag == 1:for i, j in zip(file_list, range(1, 6)):
            new_name = str(j) + "." + i
            os.rename(i, new_name)else:for i in file_list:
            new_name = i[2:]
            os.rename(i, new_name)# 前缀换成罗马数字def rename2_(flag=1):
    file_list = os.listdir()
    file_list.sort(key=lambda x: int(x[:1]))  # 默认就是根据第一位排序,后面是负数则倒数排序print(file_list)
    prefix = ['I_', 'II_', 'III_', 'IV_', 'V_', 'VI_', 'VII_', 'VIII_', 'IX_', 'X_']if flag == 1:for i, j in zip(file_list, prefix):
            new_name = j + i[2:]
            os.rename(i, new_name)  # 改哪个路径就放哪个路径下。else:for i in file_list:
            new_name = i[2:]
            os.rename(i, new_name)# 前缀用英文代替罗马数字:先按照prefix里的顺序排序,再切割。def rename3_(flag=1):
    file_list = os.listdir()
    prefix = ['I_', 'II_', 'III_', 'IV_', 'V_', 'VI_', 'VII_', 'VIII_', 'IX_', 'X_']
    new_order = []# 1.构造顺序。犯下的错:1.用zip,zip是一一对应的,这里得用双循环;2.i,j顺序反了导致和原列表一致。我真是个天才。for j in prefix:for i in file_list:if i.startswith(j):
                new_order.append(i)# 2.去掉原来的前缀用新的前缀char_list = [chr(i) for i in range(ord("a"), ord("z"))]for n, c in zip(new_order, char_list):
        index = n.find("_")
        new_name = c + n[index:]
        os.rename(n, new_name)if __name__ == '__main__':# batch_rename()# rename_(0)# rename2_()rename3_()

os操作文件

# os操作文件/包import os

os.rename('1.txt', '10.txt')
os.remove('10.txt')
os.mkdir('aa')
os.rmdir('aa')
os.chdir('aa')print(os.getcwd())print(os.listdir())print(os.listdir('aa'))print(os.path.dirname(os.path.abspath(__file__)))  # 当前文件的所在文件夹的绝对路径

读写模式

# readlines()读写文件def write_file():
    with open("test.txt", "a") as f:
        f.write("\n" + "e" * 5)def read_file():
    with open("test.txt", "r") as f:print(f.read(13))  # 读10个字符(注意换行符\n算一个),read不写参数表示读取所有data = f.readlines()[2:]  # 按行读,因为是列表类型,所以可以切片# data1 = f.readlines(6)  # 按字节读,若超出当前行字节数则读完下一行,运行时需要把另一行注释掉print(data)if __name__ == '__main__':# write_file()    read_file()"""x    写模式,新建一个文件,如果该文件已存在则会报错。
b    二进制模式。
+    打开一个文件进行更新(可读可写)。
r    以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
rb    以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。
r+    打开一个文件用于读写。文件指针将会放在文件的开头。
rb+    以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。
w    打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb    以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
w+    打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb+    以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
a    打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
ab    以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
a+    打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
ab+    以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。"""

seek改变指针

# seek(offset, start)改变指针位置,0开头1当前2结尾f = open('test.txt', 'r+')
f.seek(2)
con = f.read()  # 换行没问题,print(con)
f.close()"""seek(offset[, whence])
offset -- 开始的偏移量,也就是代表需要移动偏移的字节数,如果是负数表示从倒数第几位开始。
whence:可选,默认值为 0。给 offset 定义一个参数,表示要从哪个位置开始偏移;0 代表从文件开头开始算起,1 代表从当前位置开始算起,2 代表从文件末尾算起。"""