程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Python學習筆記七之文件操作:打開與寫入、創建與刪除、遍歷文件夾批處理等

編輯:Python

基本文件操作

1.文本文件:基於字符編碼,存儲的是普通字符串,不包括字體、字號、樣式、顏色等信息,可通過文本編輯器顯示和編輯,例如txt文件;
2.二進制文件:基於值編碼的,以字節形式存儲,其編碼長度根據值的大小長度可變。通常在文件的頭部相關屬性中定義表示值的編碼長度。例如視頻、音頻等。

1.創建和打開文件


open and close file

file=open(filename,mode)
file.close
#打開並寫入命令
file=open('123.txt','w')
#打開格式及編碼
file=open('1.png','rb')
file=open('notice.txt','r',encoding='utf-8')#打開以utf-8編碼的文件

mode模式如下:

打開文件時使用with語句

打開文件後,要及時關閉,如果忘記關閉會帶來問題,另外打開文件異常時,將會倒是文件不能被及時關閉
->使用with語句可以避免此問題發生,它將實現無論是否有異常,都可以在語句執行完畢後關閉打開的文件

with expression as target:
with-body
#with-body指執行語句,如果不想執行,可以直接用pass代替
with open('message.txt','w') as file:
pass

2.文件讀寫操作

#file.write
fp=open('test.txt','w',encoding='utf-8')
for i in range(1,11):
fp.write('hello world!' +str(i) +'\n')
fp.close()
***
output:
hello world! 1
hello world! 2
hello world! 3
hello world! 4
hello world! 5
hello world! 6
hello world! 7
hello world! 8
hello world! 9
hello world! 10
*****寫入一行******
lines=[]
for i in range(1,1):
lines.append('hello world!' +str(i) +'\n')
with open('test.txt','w',encoding='utf-8') as fp:
fp.writelines(lines)
*************************************
#file.read
with open('test.txt','r',encoding='utf-8') as fp:
content=fp.read()#讀取文件內容
print(content)
***讀取全部行***
with open('test.txt','r',encoding='utf-8') as fp:
content=fp.readlines()#讀取文件內容全部行
print(content)
***讀取一行***
with open('test.txt','r',encoding='utf-8') as fp:
number=0
while True:
number+=1
line=fp.readline()
if line='':
break
print(number,line,end='\n')#輸出每行內容
******文件復制***
with open('test.txt','r',encoding='utf-8') as fp:
content=fp.read()
with open('test_2.txt','w',encoding='utf-8') as fp:
fp.write(content)
*****將test_2.txt內容插入到test.txt文件最後*****
with open('test_2.txt','r',encoding='utf-8') as fp:
content=fp.read()
with open('test.txt','r+',encoding='utf-8') as fp:
fp.read()#讀取內容,r+將指針移動到最後
fp.write(content)
#或者
with open('test.txt','a',encoding='utf-8') as fp:#a以附加模式打開test.txt
fp.write(content)

3.文件與文件夾操作

import os

3.1 相對路徑與絕對路徑

絕對路徑指.py在電腦中的總路徑,如:F:\program\python\code\project1\code1\test.py
相對路徑是之相對於當前項目文件夾中的路徑,即:code1\test.py或者 ./code/test.py

#相對路徑
with open('demo/message.txt') as file:
pass
#or
with open(r'demo/message.txt') as file:
pass
#絕對路徑
import os
print (os.path.abspath(r'demo/message.txt'))#獲取絕對路徑
#拼接路徑,在join()函數中,如果出現多個路徑,則以最後的路徑為准
import os
print(os.path.join("E:\\code","E:\\python\\mr","Code","C:\\","demo"))
#output: 
"C\\demo"

3.2 文件操作

import os
os.rename('a.txt','b.txt')#重命名
os.remove('b.txt')#刪除文件
os.mkdir('新建1.txt')
os.getcwd()#獲取當前目錄
os.chdir("../")# 改變默認路徑
os.path.exists("c:\\demo")#判斷路徑是否存在,return False or True
******for example******
import os
path="c\\demo"
if not os.path.exists(path):#指定要創建的目錄
os.mkdir(path)
print("目錄創建成功")
else:
print("該目錄已經存在")
***
#如果指定的目錄有多級,而且最後一級的上級目錄中有不存在的,則拋出FileNotFoundError異常,並且目錄創建
#不成功,可以編寫遞歸函數調用os.mkdir()函數實現,具體代碼如下:
import os
def mkkdir(path):
if not os.path.isdir(path): #判斷是否為有效路徑
mkdir(od.path.split(path)[0])
else:
return
os.mkdir(path) #創建目錄
mkdir("D:/mr/test/demo")
******刪除目錄******
import os
path="C:\\demo\\test\\dir\\mr"
if od.path.exists(path):
os.rmdir(path)#刪除目錄
print("目錄刪除成功!")
else:
print("該目錄不存在!")
****rmdir()只能刪除空的目錄,想要刪除非空目錄,需要使用python內置標准模塊shutil的rmtree()***
import shutil
shutil.rmtree("C:\\demo\\test")

3.3 文件移動、復制(好用)

import shutil
shutil.copyfile("oldfile","newfile") #oldfile和newfile都只能是文件
shutil.copy("oldfile","newfile") #oldfile只能是文件夾,newfile可以是文件,也可以是目標目錄
shutil.copytree(“olddir”,”newdir”) #olddir和newdir都只能是目錄,且newdir必須不存在
shutil.move("oldpos","newpos")#將一個路徑移動到另一個路徑下
os.rmdir(“dir”) #只能刪除空目錄
shutil.rmtree(“dir”) #空目錄、有內容的目錄都可以刪

4.遍歷目錄

使用os.walk來遍歷文件夾及子文件夾下所有文件並得到路徑。os.walk的完整定義形式如下:

import os
os.walk(top, topdown=True, onerror=None, followlinks=False)
***input***
①top:需要遍歷目錄的地址。
②topdown為True,則優先遍歷top目錄;為False則優先遍歷top的子目錄(默認為True)。
③onerror 需要一個 callable 對象,當walk需要異常時,會調用。
④followlinks為True,則會遍歷目錄下的快捷方式實際所指的目錄(默認False)。
***output***
每次遍歷的對象返回的都是一個三元組(root,dirs,files):
①root 所指的是當前正在遍歷的這個文件夾的本身的地址|
②dirs 是一個列表,內容是該文件夾中所有的目錄的名字(不包括子目錄)
③files 是一個列表,內容是該文件夾中所有的文件的名字(不包括子目錄)

例如現在有文件夾結構如下:

os_test(文件夾)
A(文件夾)
A1(文件夾)
1.txt
2.txt
A2(文件夾)
3.txt
B(文件夾)
B1(文件夾)
4.txt
5.txt
B2(文件夾)
6.txt

通過如下demo實現:

import os
for root,dirs,files in os.walk('F:\py_dada\os_test'):
print(root)
***output***
F:python\os_test
F:python\os_test\A
F:python\os_test\A\A1
F:python\os_test\A\A2
F:python\os_test\B
F:python\os_test\B\B1
F:python\os_test\B\B2
for root,dirs,files in os.walk('F:\py_dada\os_test'):
print(dirs,files)
***output***
['A','B'], []
['A1','A2','A3'], []
[], ['1.txt','2.txt']
[], ['3.txt']
['B1','B2'], []
[], ['4.txt','5.txt']
[], ['6.txt']

獲取多有子文件路徑

import os
for root,dirs,files in os.walk('F:\\python\\os_test'):
for name in dirs:#循環輸出遍歷到的子目錄
print(os.path.join(root,name))
***output***
F:python\os_test\A
F:python\os_test\A\A1
F:python\os_test\A\A2
F:python\os_test\B
F:python\os_test\B\B1
F:python\os_test\B\B2
for root,dirs,files in os.walk('F:\\python\\os_test'):
for file in files: #循環輸出遍歷到的文件
print(os.path.join(root,file))
***output***
F:python\os_test\A\A1\1.txt
F:python\os_test\A\A1\2.txt
F:python\os_test\A\A2\3.txt
F:python\os_test\B\B1\4.txt
F:python\os_test\B\B1\5.txt
F:python\os_test\B\B2\6.txt

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved