自学python_11 文件操作

需要pycharm激活的朋友可以看一下这里,当然只是应急一下,还是要自己购买正版软件的。

https://www.cnblogs.com/pygo/p/12197198.html

文件操作


内置函数 open:

def open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True):

注意open之后一定要close,释放流资源!

mode :方式

rb read binary 图片音乐电影
rw write binary 图片音乐电影
这里是因为图片音乐电影在计算机中都是以二进制的方式存储的。

'''
	'r'       打开读取 (默认)。
    'w'       打开写,不存在则自动创建。
    'x'       重建一个新的文件然后打开它并写。
    'a'       写文件,追加。
    'b'       二进制文件。
    't'       文本模式 (默认)
    '+'       打开硬盘文件用于更新,r和t都可以。
    'U'       universal newline mode (deprecated)
'''

读:把外部的文件输入到执行过程的变量中。
写:从执行过程中输出到外部。

buffering:缓存

一个可选的整形,被用于设置缓存(缓存是调节硬件和cpu之间的缓冲作用),读取的时候先从硬盘到缓存,程序调用时一点点从缓存中取。

内置函数 read,readline,readlines:

open返回的是一个流对象,连接了文件和程序,
mode说白了相当于说明管道的类型,只有内容与管道类型一致才能传输。

read是读取文件的全部内容。
readable是判断是否可读。

stream = open(r"C:\Users\Desktop\pytest\1.txt")
# 一定要注意开头的r不能忘记加。
# 如果文件没有找到会返回error。
container = stream.read()

print(container)

print(stream.readable())

line = stream.readline()
stream.close()
# read已经将流里的东西取完了,所以这里什么也取不出来,
# 一定要注意readline使用的时间

readline 表示的是一行一行读,在每行后自动加换行标识符。

stream = open(r"C:\Users\Desktop\pytest\1.txt")

while True:
    line = stream.readline()
    # readline 读取时会在每一行后自动加换行的标识。
    print(line)
    if not line:
        # 没有内容时结束。
        break
stream.close()

readlines 把读取的每一行都放在一个列表里,每一行的后面都有换行标识符"\n",将列表返回。

写文件相关的函数

和读相似,write返回的也是一个流对象。

stream = open(r"C:\Users\向锦辉\Desktop\pytest\1.txt",'w')
s = '''
哈哈哈哈哈哈哈哈
哈哈哈哈哈哈哈
哈哈哈哈哈哈
哈哈哈哈哈
哈哈哈哈
哈哈哈
哈哈
哈
'''
result = stream.write(s)
print(result)
# 45 这里打印的是返回的字数(包括换行)。
stream.close()

writelines :形参要是一个可迭代的类型(列表元组等),虽然是lines,但是不会换行,想换行还是要加’\n’。

stream.writelines(("aaa","bbb","ccc"))

但是之前的txt里的内容没了,因为这种写的方式是在一次文件的开闭过程中,把内容清除然后把其他内容写进去。

如果不清除,可以用 ‘a’ 模式,在文本的后面追加。


文件的复制:

源文件:原来文件所在的位置。
目标文件:目标文件所在的位置。
把源文件以流的形式传给编译器,然后在以流的形式传递给目标文件,完成传递。

with open(r"C:\Users\向锦辉\Desktop\pytest\1.txt",'r') as stream1:
    container = stream1.read() # 读取文件内容。
    with open(r"C:\Users\向锦辉\Desktop\pytest\2.txt",'w') as newstream:
        newstream.write(container)

print('文件复制完成!')

with 和 open 一起使用,可以不加close,更加方便。我们平时复制粘贴的底层操作都是以流的形式进行的。



路径的相关操作:


OS 模块:

OS模块提供了很多现成的方法供我们对文件操作。

# 下面以把1.txt复制到py文件目录下为例演示一下os里的简单操作。
import os
print(os.path.dirname(__file__))
# 这段代码是把运行的py文件的地址以绝对路径的形式返回。
with open(r"C:\Users\Desktop\pytest/1.txt",'r') as stream1:
    container = stream1.read()

    path = os.path.dirname(__file__)
    # 得到当前目录的名字。
	
    path = os.path.join(path,'2.txt')
    # 新文件的名字,join是把2.txt放在了path后面。

    with open(path,'w') as wstream:
        wstream.write(container)


判断绝对路径与相对路径 isabs:

os中有判断绝对路径和相对路径的函数:
返回值为true说明是绝对路径(从盘符到文件具体位置都包含),返回false是相对路径(以py文件为参照点,相对py文件的位置)。

import os
print(os.path.isabs("1.txt"))
print(os.path.isabs("c:/"))
# ../是往外跳一层,可以使用多次。
# 不加默认是在py文件所在的文件夹内寻找。

获取当前文件所在文件夹的名字 dirname:
返回py文件所在文件夹的名字。
具体应用:

import os
print(os.path.dirname(__file__))

根据相对路径取得绝对路径 abspath:
传递一个相对路径,返回一个绝对路径。

import os
print(os.path.abspath("1.txt"))
# C:\Users\PycharmProjects\untitled2\1.txt

当前文件所在的文件夹路径 getcwd:

import os
print(os.getcwd())
# C:\Users\PycharmProjects\untitled2
# 注意不用加path

分开文件名和拓展名 split splitext:

import os
p = os.path.abspath("1.txt")
print(os.path.split(p))
print(os.path.splitext(p))
#('C:\\Users\\PycharmProjects\\untitled2', '1.txt')
#('C:\\Users\\PycharmProjects\\untitled2\\1', '.txt')

返回值是一个元组,split是把文件夹和文件区别开,splitext是把拓展名和文件名区别开。

获得文件大小的函数getsize(以字节为单位):

具体用法:

print(os.path.getsize("1.txt"))

用于拼接的函数join:

import os
p = os.getcwd()
print(p)
# C:\Users\PycharmProjects\untitled2
res = os.path.join(p,"1.txt")
print(res)
# C:\Users\PycharmProjects\untitled2\1.txt

join把1.txt前加上/并且拼到了p的后面,可以拼接多个。

遍历文件夹的函数 listdir :
返回所有的文件和文件夹的名字。

import os
print(os.listdir(r'..'))
# ['untitled', 'untitled1', 'untitled2']

返回值是一个列表。

判断一个文件(夹)是否存在 exist:

import os
print(os.path.exists(r"C:\Users\Desktop"))
# True
print(os.path.exists(r"C:\Users\Desktop/13213"))
# False

返回值是bool类型。

创建文件夹 mkdir :

import os
f = os.mkdir(r'C:\Users\Desktop\123')
print(type(f))
# <class 'NoneType'>

如果创建成功返回值是None,文件夹存在则返回error。

删除文件夹 rmdir ,removedirs:

import os
f1 = os.rmdir(r'C:\Users\Desktop/123')
f = os.removedirs(r"C:\Users\Desktop\pytest")

删除的目录必须存在且里面没有内容,可以先用exist检测一下是否存在。

删除文件 remove:

import os
print(os.remove(r"C:\Users\Desktop\pytest/2.txt"))
# None

删除成功返回值为None,不成功会报错。


下面举一个例子具体说明一下具体运用:

import os
path = r"C:\Users\Desktop\pytest"
filelist = os.listdir(path)
for file in filelist:
    newpath = os.path.join(path,file)
    os.remove(newpath)

切换目录 chdir:

import os
f = os.chdir(r"c:/")
print(f)
# None
print(os.getcwd())
# c:\

相当于 cmd 里的 cd。

复制文件夹实例:
可以写成一个递归函数。判断是否为文件夹,是文件夹就再调用递归函数,不是就正常地遍历复制,下面的代码里有具体的注释说明。

import os
def copy(src_path,target_path,flag = 0):
    '''
    :param 源文件的路径。
    :param 目标文件的路径。
    :param flag: 判断是否是第一次进入,第一次进入就要考虑文件夹是否存在。
    :return: 返回 True 表示复制成功。
    '''
    if flag == 0 and not os.path.exists(target_path) :
        # 防止进入新文件夹后重复创建。
        os.mkdir(target_path)
    filelists = os.listdir(src_path)
        # 把一个文件里的内容以列表的形式返回。
    for file in filelists :
        # 遍历列表。
        path = os.path.join(src_path,file)
        if os.path.isdir(path):
            # 遍历的内容是文件夹。
            target_path_1 = os.path.join(target_path,file)
            os.mkdir(target_path_1)
            copy(path,target_path_1,1)
        else:
            # 遍历的内容不是文件夹。
            with open(path,"rb") as rstream:
                # 读取内容作为流。
                container = rstream.read()
                path1 = os.path.join(target_path,file)
                with open(path1,'wb') as wstream:
                    # 打开文件准备将流写入。
                    wstream.write(container)
    else:
        return True

copy(r"C:\Users\Desktop\pytest\13213",r"C:\Users\Desktop\pytest\1111")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值