目标
文件的打开和关闭
mode缺省情况下表示只读r
文件的路径
前面加个r’,代表其中的转义字符不起作用
文件的打开方式
案例:实现文件拷贝的功能
将某一文件夹下的某一文件 保存在当前文件 所在目录。
import os
#读取文件1
path='./file.txt'
file=open(path,'r',encoding='utf-8')
words=file.read()
file.close()#写入文件2
path2='./file2.txt'
print(os.listdir('./'))
file2=open(path2,'x',encoding='utf-8')
file2.write(words)
file2.close()
#读取文件2
file2=open(path2,'r',encoding='utf-8')
print(file2.read())
file2.close()
文件路径分割+os模块
1.字符串
2.os模块
案例:多个文件递归复制
文件复制:
设你的文件夹p1下包含多个文件,p2为空文件夹,编写函数使其能将p1下的文件复制到p2中
写法1:
# path1 = '../lesson12'
# path2 = './path2'
path1=input('请输入要拷贝的文件路径')
path2=input('请输入空的文件路径')
# 请输入要拷贝的文件路径D:\\School\\Undergraduate\\考研学习\\C语言
# 请输入空的文件路径C:\\Users\\DQ\Desktop\\test
import osdef createFile(path1, path2):#注意:在这里不要指明编码格式,因为有些文件过于复杂,可能字符集不能表示完#rb:以二进制的形式读取file1 = open(path1, 'rb')words = file1.read()#wb以二进制的形式写入文件,w:如果文件不存在会创建文件,如果文件存在就覆盖文件file2 = open(path2, 'wb')file2.write(words)file1.close()file2.close()def copyFunction(path1, path2):oldPath = os.listdir(path1)for i in oldPath:oldPath = path1 + '/' + inewPath = path2 + '/' + iif os.path.isfile(oldPath):# 如果文件不存在才创建文件if not os.path.exists(newPath):createFile(oldPath, newPath)elif os.path.isdir(oldPath):# 如果是文件夹不存在才创建if not os.path.exists(newPath):# 创建文件夹os.mkdir(newPath)# 不管是否需要创建文件夹,都要递归新的文件夹路径copyFunction(oldPath, newPath)copyFunction(path1, path2)
写法2:
import os
def copyFile(srcFile,destFile):fileInput=open(srcFile,mode='rb+')fileOutput=open(destFile,mode='wb+')fileOutput.write(fileInput.read())fileOutput.close()fileInput.close()def copyDir(srcDir,destDir):for s in os.listdir(srcDir):newPath = os.path.join(srcDir, s)destPath = os.path.join(destDir, s)if os.path.isdir(newPath):os.mkdir(destPath)copyDir(newPath,destPath)elif os.path.isfile(newPath):copyFile(newPath,destPath)
srcDir=input("请输入需要复制的文件夹:")
destDir=input("请输入目标空文件夹:")
copyDir(srcDir,destDir)
案例:递归删除多个文件
遍历删除含有多个文件的文件夹
# author:dq
# project:PythonProject
# date:2021年10月28日
# function:遍历删除含有多个文件的文件夹。
import ospath = 'D:/CodeProject/Python_DQ/PythonProject/pythonProject/lesson13/path2'
#path=input('请输入文件路径')def delete(path):# 判断文件是否存在if os.path.exists(path):# 如果是文件,就直接删除if os.path.isfile(path):os.remove(path)# 如果是文件夹elif os.path.isdir(path):# 如果文件夹为空就就直接删除if not os.listdir(path):os.rmdir(path)# 如果文件夹不为空,就进入新的文件夹递归else:for i in os.listdir(path):#拼接获取新的文件路径newPath=os.path.join(path,i)delete(newPath)#再逐一删除外层的文件夹os.rmdir(path)delete(path)
CSV文件
关系型数据库:表格,二维数据
CSV文件读取与写入(学习)
newline=‘’识别换行符,空字符串
使用代码:
#author:dq
#project:PythonProject
#date:2021年11月01日
#function:csv文件的读写#读取csv
import csvpath='./information.csv'
file=open(path,'w',encoding='utf-8',newline='')
w=csv.writer(file)w.writerow(['name','age','gender'])
w.writerow(['dq',20,'female'])
w.writerow(['dd',20,'man'])
w.writerow(['rwq',20,'female'])
file.close()#写入CSV
file=open(path,'r',encoding='utf-8',newline='')
r=csv.reader(file)
for data in r:print(data)
将数据写入内存(了解即可)
把print输出的内容输出到到文件流(内存)
print是输出之后进行换行
file是一个文件对象
序列化和反序列化
序列化与反序列化:json
json序列化与反序列化的方法
案例代码:
#author:dq
#project:PythonProject
#date:2021年11月01日
#function:序列化与反序列化:json#写入
import json
#dumps
path='./name.txt'
file=open(path,'w',encoding='utf-8')#写入内容,有会被覆盖
names=['dq','dd','java']
content=json.dumps(names)
file.write(content)
file.close()#dump
file=open(path,'w',encoding='utf-8')#追加a+
names=['dq','java','java']
content=json.dump(names,file)
file.close()#读取
#load
file=open(path,'r',encoding='utf-8')
read=json.load(file)
file.close()
print(read,type(read))#['dq', 'java', 'java'] <class 'list'>#loads
content='{"name":"dq","age":"18"}'
p=json.loads(content)
print(p,type(p))#{'name': 'dq', 'age': '18'} <class 'dict'>
序列化与反序列化:pickle
代码:
#author:dq
#project:PythonProject
#date:2021年11月01日
#function:pickle序列化与反序列化
import pickle
#序列化
#dumps
names=['dq','java','Android']
byteContent=pickle.dumps(names)
print(byteContent)#写入文件
path='./pickle.txt'
file=open(path,'wb')
file.write(byteContent)
file.close()#读取文件
file_r=open(path,'rb')
#readContent=file_r.read()
readContent=pickle.load(file_r)
print(readContent)
file_r.close()
代码:
#author:dq
#project:PythonProject
#date:2021年11月01日
#function:pickle序列化与反序列化
import pickle
#序列化
#dumps
names=['dq','java','Android']
byteContent=pickle.dumps(names)
print(byteContent)#写入文件
path='./pickle.txt'
file=open(path,'wb')
file.write(byteContent)
file.close()#读取文件
file_r=open(path,'rb')
#readContent=file_r.read()
readContent=pickle.load(file_r)
print(readContent)
file_r.close()
json和pickle的区别
自动关闭文件:with关键字
标准输出和输入(了解)