目標
文件的打開和關閉
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關鍵字
標準輸出和輸入(了解)