乐趣区

关于python:我只不过是个python王者前篇003之文件操作

前篇的意思就是说 …… 我还没有成为 python 王者(想写大神居然通不过),只是刚刚入了个门。总是在艳羡人家玩爬虫啊,办公自动化啊,还用 python 玩玩股票啊,看起来都牛逼哄哄。我也不愿再做小菜鸟了,我也要发家致富!第一步就是把我每天学到的货色记录下来,加深点印象。有没有骚年跟我一起冲!!!好了好了,我先冲。(如果小白看到了,对我所写的务必持狐疑态度;如果大神偶然瞄到了,我写错了麻烦纠正下哈!)


文件操作

1. 根本步骤

用几句简略的代码形容下步骤:

# 1. 创立文件对象,关上
f = open('test.txt', 'w')
# 2. 写入内容
f.write('test')
# 3. 敞开文件对象
f.close()

留神:文件对象须要敞开,否则会始终占用内存。

2. 拜访模式

模式 形容
r 以只读形式关上文件。文件的指针将会放在文件的结尾。这是默认模式。
rb 以二进制格局关上一个文件用于只读。文件指针将会放在文件的结尾。这是默认模式。
r+ 关上一个文件用于读写。文件指针将会放在文件的结尾。
rb+ 以二进制格局关上一个文件用于读写。文件指针将会放在文件的结尾。
w 关上一个文件只用于写入。如果该文件已存在则关上文件,并从结尾开始编辑,即原有内容会被删除。如果该文件不存在,创立新文件。
wb 以二进制格局关上一个文件只用于写入。如果该文件已存在则关上文件,并从结尾开始编辑,即原有内容会被删除。如果该文件不存在,创立新文件。
w+ 关上一个文件用于读写。如果该文件已存在则关上文件,并从结尾开始编辑,即原有内容会被删除。如果该文件不存在,创立新文件。
wb+ 以二进制格局关上一个文件用于读写。如果该文件已存在则关上文件,并从结尾开始编辑,即原有内容会被删除。如果该文件不存在,创立新文件。
a 关上一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创立新文件进行写入。
ab 以二进制格局关上一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创立新文件进行写入。
a+ 关上一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件关上时会是追加模式。如果该文件不存在,创立新文件用于读写。
ab+ 以二进制格局关上一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创立新文件用于读写。

这里介绍几个主拜访模式:

  • r 只读,不反对写入,如果文件不存在会报错;
  • w 只写,文件不存在会新建文件;写入内容会笼罩原来内容;
  • a 追加,文件不存在会新建文件;写入内容追加至原来内容后;

如果没有拜访模式,默认为‘r’。

r+,w+,a+ 的区别:
三种模式都是可读可写,而 r + 听从 r 的属性,如果文件不存在就会报错;r+ 和 w + 的文件指针在文件的结尾,而 a + 的文件指针在文件的结尾,因而应用 a + 是无奈通过.read()间接 读取的;而应用 w + 会应用新内容去笼罩,应用.read()也是无奈 间接 读取的。

3. 文件对象办法

3.1 读
3.1.1 read()

对象.read(num)
num 示意从文件中读取数据的字节长度,没有 num 就是读取全副;能够应用 print()打印输出。

3.2 readlines()

依照行的形式一次性读取整个内容,并返回一个列表(记得换行符噢);

3.3 readline()

一次读取一行内容;

f = open('test.txt')

content = f.readline()
print(f'第一行:{content}')

content = f.readline()
print(f'第二行:{content}')

f.close()
3.4 seek()

作用:挪动文件指针(就能够解决下面说的“无奈间接读取数据”啦!)
文件对象.seek(偏移量, 起始地位)

起始地位:

  • 0:文件结尾
  • 1:以后地位
  • 2:文件结尾
f = open('test.txt', 'w+')
f.write('aaa')
f.seek(0)
print(f.read())
f.close()

如果不应用 seek 的话,在从新笼罩了 test.txt 之后,写入内容也是无奈间接读取的,因为此时指针在‘aaa’的前面,而 seek(0), 即 seek(0,0), 挪动了指针的地位到结尾,那么此时就能够通过 read()读取啦!

4. 文件备份

算是一个常识利用吧

先温习一个字符串里的函数,用于寻找最初一次呈现查找字符串的地位:
string.rfind(str, beg=0,end=len(string))

  • str: 查找的字符串
  • beg: 开始查找的地位,默认为 0
  • end: 完结查找地位,默认为 str 的长度
old_name = input("输出备份文件名:")
# 找到最初一次呈现该字符串的地位并返回
index = old_name.rfind('.')
if index > 0:  # 这里是避免文件名的不规则性
    # 记录后缀名
    postfix = old_name[index:]
# 创立备份文件名
new_name = old_name[:index]+'_bak'+postfix
# 只读关上源文件,只写关上备份文件(新建)old_f = open(old_name, 'rb')  # 用二进制读写
new_f = open(new_name, 'wb')
# 写入
content = old_f.read()
new_f.write(content)
# 敞开文件
old_f.close()
new_f.close()

在课程中,写入的时候老师应用了 old_f.read(1024)并进行 while True 的循环,直到内容为空才 break 退出循环,起因是不是.read()有可能会读取不到所有数据?

5. os 模块

import os

  • 文件重命名

os.rename()

  • 删除文件

os.remove()

  • 创立文件夹

os.mkdir()

  • 删除文件夹

os.rmdir()

  • 获取当前目录

os.getcwd()

  • 扭转默认目录

os.chdir()

  • 获取目录列表

os.listdir()

那么,来个利用案例坚固一下,批量重命名当前目录下的文件:

import os
# 获取当前目录
curr_dir = os.getcwd()
print(curr_dir)
# 将当前目录下的所有文件重命名为 secret_...
for file in os.listdir(curr_dir):
    os.rename(file, 'secret_'+file)

6. 集体补充

课程里没有 with open(...) as f: 的用法,还好之前学到过,这样的写法最大区别就是不必敞开文件了,程序会主动敞开。写法差不多,当然写法还是越简便越好!

退出移动版