天天看點

python檔案與檔案系統

檔案操作基礎

open(類型參數)

參數名 意 義
filename 要打開的檔案名
mode 可選參數,檔案打開模式
bufsize 可選參數,緩沖區大小
encoding 檔案編碼類型
errors 編碼錯誤處理方法
newlines 控制通用換行符模式的行為
closefd 控制在關閉檔案是否徹底關閉檔案

mode是打開檔案的操作模式,入下

模式字元 表示的操作
r 隻讀(預設)
w 可寫,會清楚檔案内容
a 附件資料
b 二進制資料模式
x 建立一個檔案,可寫
+ 打開檔案直接更新
t 文本模式

這些字元可以組合在一起表示對檔案的操作模式,如’rb’表示以隻讀模式打開二進制檔案;‘wt’表示以可寫模式打開文本檔案等。

bufsize為0時表示打開檔案不用緩沖,為1時表示進行緩沖,為負值時則使用系統預設值,為任何其他值則表示使用緩沖的位元組數。

encoding 表示檔案編碼的類型,如‘gbk’、‘utf-8’等,以避免讀取檔案内容出現亂碼。newline表示換行符模式,

因為在不同額系統下,換行符有所不同,換行符主要有‘\n’、‘\r’、’\r\n’等,

常用檔案操作及其功能

檔案操作 功能描述
file.read([n]) 将整個檔案讀入到字元串中,或指定n位元組
file.readline([n]) 讀入檔案的一行到字元串中
file.readlines() 将整個檔案按行讀入到清單中
file.write(s) 向為檔案中寫入字元串
file.wirtelines(lines) 向檔案中寫入一行資料清單
file.close() 關閉打開的檔案

例子:

def file_hd1(name="python.txt"):
	f = open(name)
	res = 0
	i = 0
	for line in f:
		i +=i
		print('第%s行的資料為:' % line.strip(),line)
		res += int(line)
		
	print('這些數的和為:',res)
	f.close()
	
if __name__ =='__main__':
	file_hd1()
	
           

fileinput操作檔案

fileinput子產品提供了一個以行模式循環處理一個或多個檔案内容的功能,它實作了對檔案中的‘懶惰’疊代,讀取時不需要把檔案内容放入記憶體,這樣可以提高程式的效率

fileinput子產品中常用的函數有:

input() :傳回能夠用于疊代一個或多個檔案中的所有行的對象

filename(): 傳回目前檔案的名稱

lineno(): 傳回目前讀取的行的數量

isfirstline(): 傳回目前行,判斷是否是檔案的第一行,是目前檔案的第一行時傳回真值,反之傳回假值

filelineno(): 傳回目前讀取行在檔案中的行數

fileinput 也支援上下文管理器,可以使用with語句來進行操作,二不用子啊使用後手工關閉對象

import fileinput
def demo_fileinput():
	with fileinput.input(['fpa.txt','fpb.txt']) as lines:
		print("總第%d行," %fileinput.lineno(),"檔案%s中第%d: "%(fileinput.filename(),fileinput.filelineno()))
		print(line.strip())
		
if __name__ == '__main__':
	demo_fileinput()
	
           

常用檔案和目錄操作

獲得目前路徑: os.getcwd()

獲得目錄中的内容 os.listdir(path)

獲得目前目錄的内容 os.listdir()

建立目錄 os.mkdir(path)

删除目錄 os.rmdir(path)

判斷是否為目錄 os.path.isdir(path)

判斷是否為檔案 os.path.isfile(path)

周遊某目錄下的所有檔案和目錄 :os.walk(path)

由檔案名批量擷取姓名和考号

import os

filename = []
for a,b,files in os.walk('test'):
	if files:
	filenames.append([file[:-4] for file in files])
fname = 'testname'
i = 0
for files in filenames:
	f=open(fname+str(i)+.xls','w')
	for name in files:
		f.write(name[-2:]+'\t'+name[:-2]+'\n')
	f.close()
	i +=1
print("成功生成了!")

           

批量檔案重命名

import os
perfix = 'python'
length = 2
base = 1
format = 'mdb'
# 函數PadLeft将檔案名補全到指定的長度
# str為要補全的字元
# num 為要達到的長度
# padstr 未達到長度所添加的字元
def PadLeft(str,num ,padstr):
	stringLength = len(str)
	n = num - stringlength
	if n>=0:
		str=padstr*n +str
	return str 
# 為避免誤操作,這裡先提示使用者
print('the files in %s will be renamed ' % os.getcwd())
all_files = os.listdir(os.getcwd())
print([f for f in all_files if os.path.isfile(f)]) #輸出目前目錄下的所有檔案名
input = input('press y to continue\n') #擷取使用者輸入
if input.lower() != 'y':
	exit()
filenames = os.listdir(os.curdir) # 擷取目前目錄中的内容
# 基數減1 ,為下面i=i+1在第一次執行時等于基數
i = base-1
for filename in filename:
	i = i+1
	# 判斷目前路徑是否為檔案,并且不是“rename.py”
	if filename != "rename.py" and os.path.isfile(filename):
		name = str(i)
		name = PadLeft(name,length ,'0')	#将name補全到指定長度
		t = filename.split('.')
		m = len(t)
		if format =='':
			os.rename(filename,perfix+name+'.'+t[m-1])
		else:
			if t[m-1] == format:
				os.rename(filename,perfix+name+'.'+t[m-1])
			else:
				i=i -1 # 保證i連續
	else:
		i= i-1	#保證i連續
all_files = os.listdir(os.getcwd())
print([f for in all_files if os.path.isfile(f)])

           

編譯為可執行檔案

用py2exe 生成可執行檔案

py2exe 可以将Python程式打包為Windows下獨立的可執行檔案

要使用py2exe ,首先要編寫一個編譯程式(例如編寫一個名為setup.py的程式),然後在Python中運作編譯setup.py,

即可将需要封裝的其他Python程式編譯成可執行檔案

#檔案hello.py
import ctypes
print('Hello,Python!')

#檔案setup.py
from distutils.core import setup
import py2exe
setup(console=['hello.py'])	#指定為控制台程式的主程式檔案名
           

然後在指令提示符下執行以下指令就可以完成打包:

python setup.py py2.exe

代碼中編譯的語句是setup(console=[‘hello’]),方括号中的就是要編譯的程式名,前面console 表示将其編譯成指令行界面程式。

如果要編譯GUI的可執行檔案,則将console改為Windows。另外,如果需要将程式編譯成 Windows服務,則可以使用service選項

用xx_freeze生成可執行檔案

首先需将cx_free 下載下傳到本機并安裝後才能使用。下載下傳位址為http://sourceforge.net/projects/cx_freeze/files/4.3.3

安裝成功後,接下來就可以進行Python程式的編譯操作。仍然以上節操作的hello.py為例,示範在Python3中使用cx_freeze編譯為exe檔案的方法。

(1)在指令行視窗切換到“hello.py”所在的目錄

(2)輸入以下指令:

d:\python34\Scripts\cxfreeze --target-dir=dist_cxfreeze hello.py

其中的hello.py是需要編譯的程式檔案,dist_cxfreeze是目标檔案夾,打包回生成dist_cxfreeze目錄,

在這個目錄中生成編譯後的可執行檔案。

如果想在編譯GUI界面程式運作時不出現控制台視窗的北京,則在編譯時還需添加一個base-name的參數,指令入下:

c:\python34\Script\cxfreeze gui_filename.py --target-dir dist --base-name=win32GUI

py2exe 比cxfreeze 編譯後的檔案多一些,體積也稍大

繼續閱讀