今天咱们学习的是关于python中的文件操作,在学习开始之前,咱们先来使用一下windows中的文件操作,首先,可以找到咱们pycharm创建的项目的路径,创建一个名为demo的.txt文件,在windows系统,这种文件被称为文本文档文件或者记事本,类似于备忘录一样,可以向里面添加文字内容进行保存,以达到一个记录事情的效果,现在我们打开它,在里面写入:今天是18期课堂的第8次课,然后我们对于内容进行保存,加以保存之后文本文档就记录了你所输入在里面的内容,如果我们想要查看这个文件的内容,就需要双击或者右击文件在左击选中打开来进行查看,对于刚刚的写入跟查看都是windows操作系统中的步骤,那python中的文件操作是怎么样的呢,我们可以在pycharm里进行一个实现

当我们进入pycharm时,会发现我们刚才在项目文件的根目录里创建的文本文档demo也在这里,这是因为pycharm会自动读取你项目中的所有文件内容,所以无论是进入文件夹里创建还是在pycharm里创建,都是一样的。

好的现在进入正题,我们现在点开这个文件,可以看到里面的内容,但是如何用代码,使得里面的内容在控制台显示呢?

此时就要开始学习我们在python代码中对于文件的操作。

在python中,使用open内置函数进行对于文件的操作

文件操作

"""
在python中,使用内置函数open()进行对于文件的操作
文件操作语法格式
open(文件路径, 访问模式)
访问模式
r 只读  read
w 只写  write
a 追加  append
b 处理二进制类型的文件
+ 更新(读和写)
    当上面的功能加上加号之后,都是对文件进行内容更新,如果是已存在的文件,则里面的内容会被清空后再进行操作
    如果是不存在的文件则会默认新建文件
​
对于文件打开后进行操作的方法
read()  读取
write()  写入
writelines() 写入多行内容,用中括号包裹,逗号分隔,每一个内容前添加转义字符\n
flush() 刷新当前文件的状态
close() 关闭文件
tell() 查看文件内光标目前的位置
seek() 修改光标的位置   seek(0) 将光标放到文字之前  seek(0,2) 将光标放到文字最后
​
注意:
    对于使用open()函数打开文件进行操作后,推荐在结尾进行一个关闭,
    因为在 Python中,打开文件时会将文件加载到内存中,
    如果我们没有关闭文件,那么这个文件所占用的内存就无法被释放,这可能会导致内存泄漏,同时浪费内存资源。
    应对方法: 使用close()函数对于打开的文件进行一个关闭,以节省资源
"""
​
​
# r 对于文件中内容进行读取,默认编码格式为gbk
file = open(r'D:\softData\PycharmProjects\ChengQuEdu\textfile.txt','r')
print(file.read())
file.close()
​
​
file1 = open('D:\softData\PycharmProjects\ChengQuEdu\day08-文件\demo.txt',encoding='utf-8',mode='r')  # 对于外部编辑的中文的内容读取需要设置编码为utf-8
print(file1.read())
file1.close()
​
# w 对于对文件内容进行写入,默认编码格式为gbk
file2 = open('D:\softData\PycharmProjects\ChengQuEdu\day08-文件\demo1.txt', 'w')
file2.write('这是写入的内容')
file2.writelines(['\n这是第一行内容','\n这是第二行内容'])  # 使用writelines可以录入多行内容,但是所有内容要用中括号包裹,以逗号隔开,并且在每个内容前加上换行的转义字符\n
file2.close()
​
file3 = open('D:\softData\PycharmProjects\ChengQuEdu\day08-文件\demo1.txt', 'r')  # pycharm中写入的内容,读取时不需要再设置编码格式
print(file3.read())
file3.close()
​
# a 对于文件中的内容进行追加添加
file4 = open('D:\softData\PycharmProjects\ChengQuEdu\day08-文件\demo1.txt', 'a')  # 在现存的文件里,再添加其他的内容
file4.write('\n这是追加添加的第二行内容')
file4.close()
​
​
# rb/wb 对于二进制数据的写入和读取:一般处理的文件格式为图片或者视频
file5 = open('D:\softData\PycharmProjects\ChengQuEdu\day08-文件\day03ASCII码表.png', 'rb')
image_data = file5.read()  # 将图片以二进制的形式保存在变量中
file5.close()
​
file6 = open('D:\softData\PycharmProjects\ChengQuEdu\day08-文件\day03ASCII码表_new.png', 'wb')
file6.write(image_data)  # 将二进制形式的图片变量写回图片
file6.close()
​
​
"""
+ 更新(读和写)
    当上面的功能加上加号之后,都是对文件进行内容更新,如果是已存在的文件,则里面的内容会被清空后再进行操作
    如果是不存在的文件则会默认新建文件
    r+: 使用r+模式时,可以调整光标的位置,往原有内容后面添加新的内容,再将光标调至最前面进行
    w+:读取文件前会将文件清空,使用write函数编写了内容之后,光标会默认放在最后面,read的只会读取光标后的内容,可以用seek()函数将文件中的光标放在前面,再使用read进行内容读取
"""
# w+
f = open('update.txt', 'w+')
f.write('这是新建的一个文件内容')
f.seek(0)  # 将文件内的光标移到最前面,使用读取时才能读取到内容
print(f.read())
f.close()
​
​
# r+
f1 = open(r'D:\softData\PycharmProjects\ChengQuEdu\update.txt', 'r+')
f1.seek(0, 2)  # 将光标移动至末尾
f1.write('\n这是文件更新后的内容')
f1.seek(0)
print(f1.read())
f1.close()
​
​
"""
上下文管理器with open
相比于上面使用的变量接收,上下文管理器的优势是会自动关闭文件,不用进行手动关闭
"""
with open('demo2.txt','w')as f:  # 如果不使用路径,则会默认在这个目录下创建文件
    f.write('使用上下文管理器写出来的内容')
​

文件中的IO流

"""
文件io流:在内存中创建临时文件保存文件,不会占用本地磁盘空间
    导入io包即可使用方法:import io
使用方法
StringIO  生成字符串临时文件
BytesIO   生成二进制临时文件
​
getvalue()  获取临时文件里保存的所有内容
"""
​
import io
str_io = io.StringIO()
print(str_io.write('这是写入字符串io流中的内容'))  # 如果打印写的内容,输出的是内容的长度
print(str_io.getvalue())
​
byte_io = io.BytesIO()
byte_io.write(b'this is bytes')  # 只能包含ASCII码表里的内容  # 操作二进制临时文件时需要在字符串前面加b,代表是二进制数据
print(byte_io.getvalue())

文件目录操作

上节课作业方法2中使用了float的问题

# 方法2
# 使用input函数,让用户输入内容
def is_prime1(num):
    # 判断边界条件
    if num <= 1: # 输入的内容小于等于1时
        return False
    #使用for循环判断输入的内容是否为质数
    # 25
    for i in range(2,num): # 循环从2开始,到num-1(2,22)
        if num % i == 0:  # 当输入的数字跟2至它自身减1的范围  能够整除时
            return False
    #否则,num是质数
    else:
        return True
# 当浮点类型float转为整型int时,会自动把小数点后面的内容舍弃,且不会四舍五入
# num = int(input('请输入你想要判断的数字:'))
# print(is_prime1(num))
​
# 如果要解决这个问题,需要在函数外进行input内容的判断
num = input('请输入你想要判断的数字:')
if num.isdigit():  # 判断是否全是数字
    print(is_prime1(int(num)))
else:
    print(False)

补充:电脑中打开文件扩展名的问题

"""
文件路径:
    绝对路径:D:\softData\PycharmProjects\cls18\demo.txt
    相对路径:..\demo.txt
    如果觉得相对路径方便可以使用相对路径,相对路径会有搜索不到文件的情况,如果相对路径不行,直接用绝对路径
    
文件目录操作:
对于文件的目录和文件夹进行的一些操作
​
导入 os 包进行文件夹操作
import os
​
"""
​
import os
​
print(os.getcwd())  # 获取当前文件夹的文件路径:绝对路径
# chdir 改变当前的所在的路径
os.chdir(r'D:\softData\PycharmProjects\ChengQuEdu\作业')
print(os.getcwd())
​
# listdir 得到当前文件夹下所有的文件
print(os.listdir())
​
# mkdir 创建文件夹
os.mkdir('folder')
# rename 重命名文件/文件夹
os.rename('folder', 'rename_folder')
os.rename('test1.txt', 'test0.txt')
​
# remove 文件夹
os.rmdir(r'D:\softData\PycharmProjects\ChengQuEdu\day08-文件\rename_folder')  # 删除此文件夹
​
# 判断文件夹在当前目录是否存在,如不存在则创建,如存在则不进行任何操作
file = 'image'
if not os.path.exists(file):
    os.mkdir(file)

对于使用os库对于文件夹和文件路径操作的方法有很多,对于这一些内容可以在课后看ppt看发给大家的内容,大家再对于这一些内容进行一个更深入的了解

模块和包

在python创建之初,开发人员给使用者写了很多打开即用的.py文件,使用时只需要用关键字import将这个文件导入即可使用,这就是我们常说的导入模块,或者叫导入库

我们也可以创建.py文件,将创建的python文件导入到另外的文件中去,假设我在这里创建一个名为test1的python文件,先进行一个print打印:xxxxx,在定义一个change函数,函数内的方法呢,就创造一个输入变量,而将变量加1之后进行打印输出,然后再在后面创造两个没有功能的函数。

print('test1.py文件开始运行')
def change(num):
    result = num + 1
    return print(f'此功能对于你输入的数值进行了加1,所以最后的结果为:{result}')
​
def func1():
    pass
​
def func2():
    pass

此时,我们回到记笔记的python文件中,对于test1进行一个导入,当导入test1的python文件后,在test1里定义的函数,就可以在这边进行调用,现在我创建一个a为1的变量,然后再对test1里定义的change函数进行调用,我们来运行一下看,发现在test1中的功能就已经被我们调用并且使用了

"""
模块和包
import xxx: 导入模块/导包
​
"""
import test1  # 导入整个包,导入之后,该文件就已经是运行状态
a = 1
test1.change(a)  # 根据包名进行函数功能调用

当然,我们也可以对于里面的单个函数方法进行导入,假如在test1这个文件里,我只需要这个change函数方法,就可以对于这个方法进行单独导入,使用from 包名 import 方法名 的方式进行导入,

from test1 import change  # 单独导入包里的一个方法

单独调用后,在使用这个方法时就不用在先调用包名,再选中方法

b = 5
change(b)  # 单独导入方法后,可以直接使用,不需要在包里选择功能
from io import StringIO as Si  # 取别名
temp_file = Si()
temp_file.write('这是临时文件中的内容')
print(temp_file.getvalue())
​
"""
在以后的学习中会用到非自带的库(第三方库),就需要将第三方的库下载到python解释器中进行使用
下载方法:
    1、在pycharm的控制台里有一个Terminal(终端)的一个选项,
    选择之后在里面输入:pip install 库名  ,按住输入完成后按下回车键,即可开始下载
    
    2、使用win+R键弹出运行,在运行窗口输入 cmd 敲击回车/点击确定,即可进入cmd窗口
    在cmd窗口内输入::pip install 库名  ,按住输入完成后按下回车键,即可开始下载
​
下载后的第三方库会存在python解释器中的lib/site-package包里
也可以在下载的窗口内输入  pip list  查看已存在/下载的第三方库
"""
​
import sys  # 系统操作模块
"""
pychram只会识别已导入的库/模块
如果模块未导入在内,则不会识别该库/模块
"""
print(sys.path)  # 查看已导入模块的路径
​
# 如果需要将自制的库导入在内,可以使用 sys.path.append(path) 将路径添加至此列表即可
sys.path.append()

对于文件的单独测试,main方法测试:

使用main方法调用的函数内容,在被其他文件导入时,调用的函数则不会运行

对于功能的单独测试

import test1
​
import test2
​

test1

print('test1.py文件开始运行')
def change(num):
    result = num + 1
    return print(f'此功能对于你输入的数值进行了加1,所以最后的结果为:{result}')

def func1():
    print('这是func1函数的运行结果')

def func2():
    pass

func1()

test2

print('test2开始运行')
​
def func():
    print('这是func函数的运行结果')
​
"""
__name__ 模块名
__main__ 模块运行时的名字
"""
if __name__ == '__main__':
    func()