Python 文件操作

简介

文件读写是很多应用程序的基本功能和重要组成部分。Python可以使文件管理极其简单,特别是和其它语言相对比。

语法 open('文件名','访问模式')

f = open(filename, mode)
f.close()
下面关于 open() 调用的解释:
  • f 是 open() 返回的文件对象
  • filename 是该文件的字符串名
  • mode 是指明文件类型和操作的字符串
文件操作模式
模式说明
r(1)读模式(默认模式),用来读取文件内容。文件指针在文件的开头。文件需要事先存在,否则会产生FileNotFoundError异常。
w(1)写模式,用来向文件写入数据。文件指针在文件的开头。如果文件存在,则覆盖文件,否则会创建文件。
a(1)追加模式,用来向文件追加数据。文件指针在文件的末尾。如果文件存在,不会覆盖文件(追加写入),否则会创建文件。
x(1)写模式,用来向文件写入数据。文件指针在文件的开头。如果文件不存在,创建文件,否则产生错误。
t(2)文本(字符串)模式(默认模式),以文本形式操作文件。
b(2)二进制(字节)模式,以二进制形式操作文件。
+(3)读取或写入。

说明:在上表的(1)(2)(3)模式中,不同组的模式可同时使用,例如rt,wb+等。同一组的模式同时使用,例如rw,tb等。

区别:
  • w+与r+区别:
    • r+:可读可写,若文件不存在,报错。
    • w+: 可读可写,若文件不存在,创建 。
  • r+与a+区别:
    • r+ 进行了覆盖写
    • a+ 是文件末尾追加

文件操作常用方法属性

f.read()
  • 读取文件的内容,调用 f.read(size), 这将读取一定数目的数据, 然后作为字符串或字节对象返回。
  • size 是一个可选的数字类型的参数。 当 size 被忽略了或者为负, 那么该文件的所有内容都将被读取并且返回。
f = open('test.txt', 'r')
content = f.read()
f.close()
f.readline()

f.readline() 会从文件中读取单独的一行。换行符为 ‘\n’

f = open('test.txt', 'r', encoding='utf-8')
content_line = f.readline()
f.close()
f.readline() 遍历
# 方式一
f = open('test.txt', 'r', encoding='utf-8')
for line in f:
    print(line)  # 每次读取一行
f.close()

# 方式二
f = open('test.txt', 'r', encoding='utf-8')
while True:
    line = f.readline()
    if not line:
        break
    print(line)
f.close()
f.readlines()

f.readlines() 将返回该文件中包含的所有行。

f = open('test.txt', 'r', encoding='utf-8')
lines = f.readlines()
f.close()
f.seek()/f.tell()

如果要改变文件当前的位置, 可以使用 f.seek( offset: int, whence: int ) 函数。

  • offset:偏移值
  • whence: 0 表示开头, 如果是 1 表示当前位置, 2 表示文件的结尾
f = open('test.txt', 'r')
f.seek(6, 0)
offset = f.tell()
print(offset)  # 6
content = f.read(1)
f.close()
使用with open打开文件
# 在with处打开的文件,可以保证,在with结束后一定能够得到有效的关闭。(无需我们显式调用close方法)
with open("backup.data", "w", encoding='utf-8') as f:
    # 向文件写入数据。
    f.write("我想写入点内容")

os 模块

os 模块提供了很多操作目录与文件的功能,主要对文件文件夹增删改查操作

import os

# 重命名
# src 源文件路径,dst 重命名后的文件路径
os.rename('file/text.txt', 'file/text.txt')

# 重命名所有路径
# old 原路径,new 新路径
os.renames('file/text.txt', 'fil2/text2.txt')

# 删除文件
# 如果path不是一个文件,或者文件不存在,将会产生FileNotFoundError异常
os.remove('file/text.txt')

# 新建文件夹
# 如果path所在父母了不存在,或者path目录已存在,都会产生FileNotFoundError或FileExistsError异常
os.mkdir('file/new_dir')

# 删除文件夹
# path必须是空目录,否则产生OSError异常
os.rmdir('file/new_dir')

# 创建多级目录
# 如果path所在的父目录不存在,则会连同父目录一同创建。
# 如果path目录已经存在,当exist_ok值为False,会产生FileExistsError异常,如果exist_ok值为True,则不会产生异常(默认值为False)
os.makedirs('file/new1/new2/new3', exist_ok=True)

# 删除多级目录
os.removedirs('file/new1/new2/new3')

# 获取当前目录
cur_dir = os.getcwd()
print(cur_dir)

# 改变目录
os.chdir('../')
cur_dir = os.getcwd()
print(cur_dir)

# 获取目录列表
dir_list = os.listdir('.')
print(dir_list)

# 执行脚本
os.system("print('hello python')")

path 模块

os 模块里面重要的子模块 path,主要是路径拼接切割

from os import path

# 切割文件或文件夹
# 返回一个元组,第一个元素是目录,第二个元素是文件名
file_tuple = path.split('file/text.txt')

# 切割文件 (文件名,后缀)
files = path.splitext('file')

# 判断是否是文件
isfile = path.isfile('text.txt')

# 判断是否是文件夹
isdir = path.isdir('text.txt')

# 判断文件或文件夹是否存在
isexists = path.exists('text.txt')

# 获取文件或文件夹大小
size = path.getsize('text.txt')

# 获取文件或文件夹绝对路径
abspath = path.abspath('file')

# 拼接字符串
str = path.join('hello', 'python')
# print(str)  # hello\python

# 获取文件名
basename = path.basename('file/text.txt')
# print(basename)  # text.txt

# 获取相对路径
dirname = path.dirname('file/new1/new2/newe3/text.txt')
# print(dirname)  # file/new1/new2/newe3

pathlib

pathlib中的Path类可以创建path路径对象, 属于比os.path更高抽象级别的对象.

from pathlib import Path

# / 拼接路径
data_dir = Path('folder')
file_to_open = data_dir / 'data.txt'
# print(file_to_open)  # folder\data.txt

filename = Path('file/text.txt')

# 获取文件名
name = filename.name

# 获取文件名后缀
suffix = filename.suffix

# 获取文件名(无后缀)
stem = filename.stem

# 判断文件或文件夹是否存在
exists = filename.exists()

shutil模块

shutil模块提供了高级操作文件的方式。我们可以通过该模块提供的功能,快捷方便的对文件或目录执行复制、移动等操作。

import shutil
import os

# 文件复制
root_path = os.getcwd()
root_path = root_path.replace('\\', '/')
src_path = root_path + '/src/src.txt'
dst_path = root_path + '/dst/dst.txt'

# 复制文件
shutil.c(src_path, dst_path)

# 复制文件
shutil.copyfile('file/work.py', 'file/work2.py')

# 复制文件
file1 = open('file/work.py', 'r', encoding='utf-8')
file2 = open('file/work2.py', 'w', encoding='utf-8')
shutil.copyfileobj(file1, file2)

# 复制多级目录文件(递归复制)
shutil.copytree('D:/PythonProject/PyProject2/src', 'D:/PythonProject/PyProject2/dst')

# 删除多级目录文件
shutil.rmtree('D:/PythonProject/PyProject2/dst')

# 移动多级文件或目录
shutil.move('D:/PythonProject/PyProject2/src', 'D:/PythonProject/PyProject2/dst')

案例

文件异常处理
try:
    file = open('text.txt', 'r', encoding='utf-8')
    100 / 0
    print(file.read())
except:
    print('发生异常')
finally:
    if file != None:
        file.close();
        print('资源回收')

输出信息

发生异常
资源回收
文件遍历
file = open('text.txt', 'r+', encoding='utf-8')
for f in file:
    print(f.strip())
file.close()
大文件复制
def copy_large_file():
    old_file = open('video/视频.wmv', 'rb')
    old_file_name = old_file.name
    position = old_file_name.rfind('.')
    pre = old_file_name[:position]
    sux = old_file_name[position:]
    new_file_name = pre + '[复制]' + sux
    new_file = open(new_file_name, 'wb')

    while True:
        content = old_file.read(1024)
        if len(content) == 0: break
        new_file.write(content)

    old_file.close()
    new_file.close()
文件批量重命名
def rename_files():
    os.chdir('file')
    file_list = os.listdir()
    for file_name in file_list:
        if os.path.isfile(file_name):
            position = file_name.rfind('.')
            pre = file_name[:position]
            sux = file_name[position:]
            os.rename(file_name, pre + '[重命名]' + sux)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值