Python文件操作基础教程

Posted 宁静与致远

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python文件操作基础教程相关的知识,希望对你有一定的参考价值。

1.文件操作概述

1.什么是文件

内存中存放的数据在计算机关机后就会消失。要长久保存数据,就要使用硬盘、光盘、U 盘等设备。为了便于数据的管理和检索,引入了**“文件”**的概念。
一篇文章、一段视频、一个可执行程序,都可以被保存为一个文件,并赋予一个文件名。操作系统以文件为单位管理磁盘中的数据。一般来说,文件可分为文本文件、视频文件、音频文件、图像文件、可执行文件等多种类别

2.文件操作的作用

文件操作的作用就是把一些内容(数据)存储存放起来,可以让程序下一次执行的时候直接使用,而不必重新制作一份,省时省力。

2.文件的基本操作

1.文件的操作步骤

想想我们平常对文件的基本操作,大概可以分为三个步骤(简称文件操作三步走):
① 打开文件
② 读写文件
③ 关闭文件

注意:可以只打开和关闭文件,不进行任何读写

2.open()打开函数

在Python,使用open函数,可以打开一个已经存在的文件,或者创建一个新文件,语法如下

open(name, mode)

name:是要打开的目标文件名的字符串(可以包含文件所在的具体路径)。
mode:设置打开文件的模式(访问模式):只读、写入、追加等。

示例代码:

f = open('python.txt', 'r')

注意:此时的fopen函数的文件对象,对象是Python中一种特殊的数据类型,拥有属性和方法,可以使用对象.属性或对象.方法对其进行访问,后续面向对象课程会给大家进行详细的介绍。

3.mode访问模式详解

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

4.写操作快速入门

1.写操作快速入门

# 1. 打开文件
f = open('python.txt', 'w')

# 2.文件写入
f.write('hello world')

# 3. 关闭文件
f.close()

注意:
w模式和a模式:如果文件不存在则创建该文件;如果文件存在,w模式先清空再写入,a模式直接末尾追加。
r模式:如果文件不存在则报错。

2.读操作相关方法

1.read()方法:

num表示要从文件中读取的数据的长度(单位是字节),如果没有传入num,那么就表示读取文件中所有的数据。

文件对象.read(num)

2.readlines()方法:

readlines可以按照行的方式把整个文件中的内容进行一次性读取,并且返回的是一个列表,其中每一行的数据为一个元素。

f = open('python.txt')
content = f.readlines()

# ['hello world\\n', 'abcdefg\\n', 'aaa\\n', 'bbb\\n', 'ccc']
print(content)

# 关闭文件
f.close()

3.readline()方法

readline()方法:一次读取一行内容,每运行一次readline()函数,其就会将文件的指针向下移动一行

f = open('python.txt')

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

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

# 关闭文件
f.close()

4.seek()方法

seek()方法用来移动文件指针

文件对象.seek(offset,whence=0)

offset:开始的偏移量,也就是代表需要移动偏移的字节数
whence:给offset参数一个定义,表示要从哪个位置开始偏移;0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起。

如果操作成功,则返回新的文件位置,如果操作失败,则函数返回 -1。

>>> f = open('workfile', 'rb+')
>>> f.write(b'0123456789abcdef')
16
>>> f.seek(5)      # 从0开始向右移动5个字节
5
>>> f.read(1)
b'5'
>>> f.seek(-3, 2)  # 从右向左移动3个字节
13
>>> f.read(1)
b'd'

r:Python 将会按照编码格式进行解析,read() 操作返回的是str
rb:也即 binary mode,read()操作返回的是bytes

重置指针到文件的开头:

f.seek(0)

f.seek(0, 0)

5.close()方法

基本语法:

文件对象.close()

3.文件备份案例

文件备份代码实现

备份文件写入数据

打开源文件 和 备份文件
将源文件数据写入备份文件
关闭文件

old_name = input('请输入您要备份的文件名:')

index = old_name.rfind('.')

if index > 0:
    postfix = old_name[index:]
    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:
            break
        new_f.write(con)

    old_f.close()
    new_f.close()

4.文件和文件夹的操作

1.os模块

在Python中文件和文件夹的操作要借助os模块里面的相关功能,具体步骤如下:
① 导入os模块

import os

② 还用os模块的相关功能

os.函数()

2.文件操作

编号函数功能
1os.rename(目标文件名称,新文件名称)对文件进行重命名操作
2os.remove(要删除文件名称)对文件进行删除操作

案例:把Python项目目录下的python.txt文件,更名为linux.txt,查看效果后,对文件进行删除操作。

# 1、导入os模块、time模块
import os
import time

# 2、调用rename方法实现重命名(需要手工刷新左侧导航栏)
os.rename('python.txt', 'readme.txt')

# 3、调用time模块中的sleep方法休眠100s
time.sleep(100)

# 4、删除readme.txt文件
os.remove('readme.txt')

3.文件夹操作

编号函数功能
1os.mkdir(新文件夹名称)创建一个指定名称的文件夹
2os.getcwd()current work directory,获取当前目录名称
3os.chdir(切换后目录名称)change directory,切换目录
4os.listdir(目标目录)获取指定目录下的文件信息,返回列表
5os.rmdir(目标目录)用于删除一个指定名称的"空"文件夹

案例:准备一个static文件夹以及file1.txt、file2.txt、file3.txt三个文件
① 在程序中,将当前目录切换到static文件夹
② 创建一个新images文件夹以及test文件夹
③ 获取目录下的所有文件
④ 移除test文件夹

代码实现:

# 1、导入os模块
import os


# 2、将当前工作目录切换到static文件夹
os.chdir('static')
# print(os.getcwd())

# 3、创建images以及test文件夹
os.mkdir('images')
os.mkdir('test')

# 4、获取目录下的所有文件
for i in os.listdir():
    print(i)

# 5、移除test文件夹
os.rmdir('test')

5.文件操作应用案例

需求分析:批量修改文件名,既可添加指定字符串,又能删除指定字符串。

步骤:
① 设置添加删除字符串的的标识
② 获取指定目录的所有文件
③ 将原有文件名添加/删除指定字符串,构造新名字
④ os.rename()重命名

import os

# 设置标识:如果为1则添加指定字符,flag取值为2则删除指定字符
flag = 1

# 获取指定目录
dir_name = './static'

# 获取指定目录的文件列表
file_list = os.listdir(dir_name)

# print(file_list)
# 遍历文件列表内的文件
for name in file_list:

    # 添加指定字符
    if flag == 1:
        new_name = 'Python-' + name
    # 删除指定字符
    elif flag == 2:
        num = len('Python-')
        new_name = name[num:]

    # 打印新文件名,测试程序正确性
    print(new_name)
    
    # 重命名
    os.rename(dir_name+name, dir_name+new_name)

ParisGabriel:Python全栈工程师(0基础到精通)教程 第二十五课(文件操作)

 

ParisGabriel
 
 
 
         每天坚持手写  一天一篇  决定坚持几年 为了梦想为了信仰
 
  

                      Python人工智能从入门到精通

 

 

 

最近简直要死了 发烧感冒 喉咙痛。。。。、

 


如何长期保存计算机中数据:
需要文件操作

  文件 file:
    文件是用于数据存储的单位
    文件通常用来长期储存数据
    文件中的数据以字节为单位进行顺序储存
文件的操作流程:
  1.打开文件
  2.读/写文件
  3.关闭文件
  注:
    任何操作系统, 一个应用程序同时打开文件数量有最大数
文件打开函数:
  open(file, mode=‘rt’) 用于打开一个文件, 返回此文件流对象,
  如果打开文件失败, 则会触发osError错误
文件的关闭方法:
  F.colse() #关闭问津 释放系统资源

示例:

# 此示例示意文件的打开和关闭操作
try:
    f = open(\'./aaa.txt\')  # 不存在此文件
    # f = open(\'./myfile.txt\')  # 不存在此文件
    print("打开文件成功")

    # 此处要进行读/写操作

    f.close()  # 半闭文件
except OSError:
    print("文件打开失败")

文件方法:

文件

mode 模式字符的含义

字符含义
\'r\' 以只读方式打开(默认)
\'w\' 以只写方式打开,删除原有文件内容(如果文件不存在,则创建该文件并以只写方式打开)
\'x\' 创建一个新文件, 并以写模式打开这个文件,如果文件存在则会产生"FileExistsError"错误
\'a\' 以只写文件打开一个文件,如果有原文件则追加到文件末尾
\'b\' 用二进制模式打开
\'t\' 文本文件模式打开 (默认)
\'+\' 为更新内容打开一个磁盘文件 (可读可写)
  • 缺省模式是 \'rt\'
  • \'w+b\' 可以实现二进制随机读写,当打开文件时,文件内容将被清零
  • \'r+b\' 以二进制读和更新模式打开文件,打开文件时不会清空文件内容
  • \'r+\' 以文本模式读和更新模式打开文件,打开文件时不会清空文件内容

python 文件常用方法:

方法说明
F.close() 关闭文件(关闭后文件不能再读写会发生ValueError错误)
F.readline() 读取一行数据, 如果到达文件尾则返回空行
F.readlines(max_chars=-1) 返回每行字符串的列表,max_chars为最大字符(或字节)数
F.writelines(lines) 将字符串的列表或字符串的列表中的内容写入文件
二进制文件操作方法  
F.read(size=-1) 从一个文件流中最多读取size个字符(文本文件)或字节(二进制文件),如果不给出参数,则默认读取文件中全部的内容并返回
F.write(text) 写一个字符串到文件流中,返回写入的字符数(文本文件)或字节数(二进制文件)
F.tell() 返回当前文件流读写指针的绝对位置(字节为单位)
F.seek(offset, whence=0) 改变数据流读写指针的位置,返回新的绝对位置
F.flush() 把写入文件对象的缓存内容写入到磁盘
   
F.readable() 判断这个文件是否可读,可读返回True,否则返回False
F.writable() 判断这个文件是否可写,可写返回True,否则返回False
F.seekable() 返回这个文件对象是否支持随机定位
F.truncate(pos = None) 剪掉 自pos位置之后的数据,返回新的文件长度

 


文本文件操作:
  操作模式:
  ‘t’
  说明:
    1.默认文件储存的都为字节数据, 在读写过程会自动进行编解码操作
    2.文本文件以行位单位进行分割, 在python内部统一用"\\n"做为换行符进行分割
    3.对文本文件的读写操作需要用字符串(str)进行数据操作
Linux换行符: \'\\n\'
Windows 换行符: \'\\r\\n\'
新的Mac OS 换行符: \'\\n\'
旧的Macintosh换行符: \'\\r\'(已不用了)

 

文件流对象是可迭代对象, 迭代过程中将换行符“\\n”作为分隔符

    f = open(\'phonenumber.txt\')
    for line in f:
        print(line)  # 打印每一行的数据

 

标准输入输出文件:
  sys.stdin    标准输入文件
  Ctrl + D      输入文件结束符
  sys.stdout    标准输出文件
  sys.stderr       标准错误输出文件
  标准文件绝对不能关闭
Linux系统内所有的硬件都会映射成文件 关闭文件会导致错误
模块:sys
注:
  标准文件不需要打开和关闭就可以使用
示例:

import sys

sys.stdout.write("我是标准输出\\n")
sys.stderr.write("我是一个错误\\n")


import sys

s = sys.stdin.read()
print("s=", s)


print("程序结束")

 

二进制文件操作:
  二进制文件操作模式字符:‘b’
  默认文件中存储的是以字节数据为单位通常有人为规定格式
  二进制文件操作需要用字节串进行读写
  F.read()/F.readline() F.readlines()返回类型
对于文本操作
  F.write() 对于二进制文件也需要用字节串进行操作
  F.tell
  作用:
    返回当前的读写位置(从文件头以字节为单位)
  F.seek方法:
    F.seek(偏移量,whence=相对位置)
  偏移量
    大于0的数代表向文件尾方向移动的字节数
    小于0的数代表向文件头方向移动的字节数
  相对位置
    0代表从文件头开始偏移
    1代表从文件当前位置开始偏移
    2代表从文件尾开始偏移 (第一个参数必须是负的)
示例:

# 此示例示意用seek改变文件的读写位置,用tell来得到读写位置

f = open(\'myseek.txt\', \'rb\')
b = f.read(2)  # b\'AB\' 读取出来
print(b)  # b\'AB

# 从头开始向后走5个字节
# f.seek(5, 0)

# 从当前位置向后走3个字节
# f.seek(3, 1)

# 从文件尾向前数15个字节
f.seek(-15, 2)

b = f.read(5)
print(b)  # b\'abcde\'

f.close()

 

汉字编码(只讲两种)
  国标系列:
    GB18030(二字节或四字节编码27553个字)
    GBk二字节编码21003个字)
    GB2312二字节编码6763个字)
    (Windows 常用)
  国际标准Unicode <---> UTF-8 (Ascii 占1字节 汉字占3字节)
    (Linux Mac OS X / IOS /Android)
    python编码字符串:
    ‘gb18030’
    ‘gb2312’
    ‘gbk’
    ‘utf-8’
    ‘ascii’
    ....
以上字符串用于encidedecode
编码注释:
  在Python源文件中的第一行第二行写入如下内容:
    # -*- codeing:gbk -*-
    #设置源文件编码格式为gbk
    或
    # -*- codeing:utf-8 -*-
    #设置源文件编码格式为utf-8
  作用:
    告诉解释执行器文件的编码是什么

 

练习:
自己写一个文件 \'info.txt\' 内部存一些文字信息
如:
张三 20 100
李四 21 96
小王 22 98
写程序将这些数据读取出来,打印到终端上

答案:

try:
    f = open("myfile.txt")
    L = f.readlines()
    for x in L:
        s = x.strip()
        n, a, s = s.split()
        print("姓名:", n, "年龄:", int(a), "成绩:", int(s))
except:
    print("打开文件是失败")

练习:
1. 写程序,循环输入很多个人的姓名,电话号码,
当输入结束后将这些信息存入到文件phonenumber.txt中
(建议先用列表暂存数据,格式自己定义)

  2. 写程序,将phonenumber.txt文件中的数据读取出来.
     再用以下格式打印出来:
如:
小张 的电话是 13888888888
小李 的电话是 13999999999

 

练习:
1. 写程序实现复制文件的功能
要求:
1. 要考虑特大文件问题
2. 要关闭文件
3. 要能复制二进制文件
如:
请输入源文件路径名: /home/tarena/xxx.tar.gz
请输入目标文件路径名: ./a.tar.gz
显示:
文件已成功复制

答案:

def copy_myfile():
    try:
        ypath = input("please inout raw path:")
        xpath = input("please inout new path:")
        f1 = open(xpath, "w+b")
        f = open(ypath, "r+b")
        for x in f:
            f1.write(x)
        f1.close()
        f.close()
    print("File copied")
    except:
        print("file not inexeistence")


copy_myfile()

2. 修改学生信息管理程序,要求加入两个功能:
9) 保存信息到文件(si.txt)

 

L = [{"name": "Tom", "age": 20, "score": 98},
     {"name": "Lin", "age": 21, "score": 99},
     {"name": "Garin", "age": 19, "score": 100}]


def student_file(L):
    try:
        f = open("./si.txt", "x")
        for x in L:
            f.write(x["name"])
            f.write(" ")
            f.write(str(x["age"]))
            f.write(" ")
            f.write(str(x["score"]))
            f.write("\\n")
    except FileExistsError:
        f = open("./si.txt", "a")
        for x in L:
            f.write(x["name"])
            f.write(" ")
            f.write(str(x["age"]))
            f.write(" ")
            f.write(str(x["score"]))
            f.write("\\n")

student_file(L)

 

 

10) 从文件中读取数据(si.tx

def open_student_file():
    f = open("./si.txt")
    L = []
    for line in f.readlines():
        s = line.strip()
        n, a, s = s.split()  # 拆成列表
        student = {"name": n, "age": a, "score": s}
        L.append(student)
    f.close()
    return L

源码:    https://pan.baidu.com/s/1vVuH7OwNdn8vqaBKAivniQ
异常还没处理...........

以上是关于Python文件操作基础教程的主要内容,如果未能解决你的问题,请参考以下文章

Python开发实战教程-向网页提交获取数据

python简介 零基础学习python基础教程1

学习笔记之Python 基础教程

零基础学Python入门教程

Python入门基础教程-基础数据类型

Python入门学习教程:数据库操作,连接MySql数据库