需要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")