Python文件IO操作涉及文件讀寫操作,獲取文件後綴名
,修改後綴名,獲取文件修改時間,壓縮
文件,加密
文件等操作。
1 獲取後綴名
import os
file_ext = os.path.splitext('./data/py/test.py')
front,ext = file_ext
In [5]: front
Out[5]: './data/py/test'
In [6]: ext
Out[6]: '.py'
2 文件讀取操作
import os
# 創建文件夾
def mkdir(path):
isexists = os.path.exists(path)
if not isexists:
os.mkdir(path)
# 讀取文件信息
def openfile(filename):
f = open(filename)
fllist = f.read()
f.close()
return fllist # 返回讀取內容
X=openfile('./data/py/test.py')
3 文件寫操作
# 寫入文件信息
# example1
# w寫入,如果文件存在,則清空內容後寫入,不存在則創建
f = open(r"./data/test.txt", "w", encoding="utf-8")
print(f.write("測試文件寫入"))
f.close
# example2
# a寫入,文件存在,則在文件內容後追加寫入,不存在則創建
f = open(r"./data/test.txt", "a", encoding="utf-8")
print(f.write("測試文件寫入"))
f.close
# example3
# with關鍵字系統會自動關閉文件和處理異常
with open(r"./data/test.txt", "w") as f:
f.write("hello world!")
4 批量修改文件後綴
本例子使用Python的os
模塊和 argparse
模塊,將工作目錄work_dir
下所有後綴名爲old_ext
的文件修改爲後綴名爲new_ext
。通過本例子,大家將會大概清楚argparse
模塊的主要用法。
導入模塊
import argparse
import os
定義腳本參數
def get_parser():
parser = argparse.ArgumentParser(description='工作目錄中文件後綴名修改')
parser.add_argument('work_dir',metavar='WORK_DIR',type=str,nargs=1,
help='修改後綴名的文件目錄')
parser.add_argument('old_ext', metavar='OLD_EXT',
type=str, nargs=1, help='原來的後綴')
parser.add_argument('new_ext', metavar='NEW_EXT',
type=str, nargs=1, help='新的後綴')
return parser
後綴名批量修改
def batch_rename(work_dir, old_ext, new_ext):
"""
傳遞當前目錄,原來後綴名,新的後綴名後,批量重命名後綴
"""
for filename in os.listdir(work_dir):
# 獲取得到文件後綴
split_file = os.path.splitext(filename)
file_ext = split_file[1]
# 定位後綴名爲old_ext 的文件
if old_ext == file_ext:
# 修改後文件的完整名稱
newfile = split_file[0] + new_ext
# 實現重命名操作
os.rename(
os.path.join(work_dir, filename),
os.path.join(work_dir, newfile)
)
print("完成重命名")
print(os.listdir(work_dir))
主函數實現Main
def main():
"""
main函數
"""
# 命令行參數
parser = get_parser()
args = vars(parser.parse_args())
# 從命令行參數中依次解析出參數
work_dir = args['work_dir'][0]
old_ext = args['old_ext'][0]
if old_ext[0] != '.':
old_ext = '.' + old_ext
new_ext = args['new_ext'][0]
if new_ext[0] != '.':
new_ext = '.' + new_ext
batch_rename(work_dir, old_ext, new_ext)
5 xls批量轉換成xlsx
import os
def xls_to_xlsx(work_dir):
"""
傳遞當前目錄,原來後綴名,新的後綴名後,批量重命名後綴
"""
old_ext, new_ext = '.xls', '.xlsx'
for filename in os.listdir(work_dir):
# 獲取得到文件後綴
split_file = os.path.splitext(filename)
file_ext = split_file[1]
# 定位後綴名爲old_ext 的文件
if old_ext == file_ext:
# 修改後文件的完整名稱
newfile = split_file[0] + new_ext
# 實現重命名操作
os.rename(
os.path.join(work_dir, filename),
os.path.join(work_dir, newfile)
)
print("完成重命名")
print(os.listdir(work_dir))0
實例測試:
xls_to_xlsx('./data')
6 獲取指定後綴名的文件
import os
def find_file(work_dir,extension='jpg'):
lst = []
for filename in os.listdir(work_dir):
print(filename)
splits = os.path.splitext(filename)
ext = splits[1] # 拿到擴展名
if ext == '.'+extension:
lst.append(filename)
return lst
r = find_file('.','md')
print(r) # 返回所有目錄下的md文件
7 批量獲取文件修改時間
# 獲取目錄下文件的修改時間
import os
from datetime import datetime
print(f"當前時間:{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
def get_modify_time(indir):
for root, _, files in os.walk(indir): # 循環D:\works目錄和子目錄
for file in files:
absfile = os.path.join(root, file)
modtime = datetime.fromtimestamp(os.path.getmtime(absfile))
now = datetime.now()
difftime = now-modtime
if difftime.days < 20: # 條件篩選超過指定時間的文件
print(f"""{absfile}
修改時間[{modtime.strftime('%Y-%m-%d %H:%M:%S')}]
距今[{difftime.days:3d}天{difftime.seconds//3600:2d}時
{difftime.seconds%3600//60:2d}]""") # 打印相關信息
實例測試:
get_modify_time('./data')
輸出效果:
當前時間:2019-12-22 16:38:53
./data\cut_words.csv
修改時間[2019-12-21 10:34:15]
距今[ 1天 6時 4]
8 批量壓縮文件
import zipfile # 導入zipfile,這個是用來做壓縮和解壓的Python模塊;
import os
import time
def batch_zip(start_dir):
start_dir = start_dir # 要壓縮的文件夾路徑
file_news = start_dir + '.zip' # 壓縮後文件夾的名字
z = zipfile.ZipFile(file_news, 'w', zipfile.ZIP_DEFLATED)
for dir_path, dir_names, file_names in os.walk(start_dir):
# 這一句很重要,不replace的話,就從根目錄開始複製
f_path = dir_path.replace(start_dir, '')
f_path = f_path and f_path + os.sep # 實現當前文件夾以及包含的所有文件的壓縮
for filename in file_names:
z.write(os.path.join(dir_path, filename), f_path + filename)
z.close()
return file_news
測試用例:
batch_zip('./data/ziptest')
9 文件加密—32位加密
import hashlib
# 對字符串s實現32位加密
def hash_cry32(s):
m = hashlib.md5()
m.update((str(s).encode('utf-8')))
return m.hexdigest()
print(hash_cry32(1)) # c4ca4238a0b923820dcc509a6f75849b
print(hash_cry32('hello')) # 5d41402abc4b2a76b9719d911017c592
關於文件加密和解密的詳細資料,參見:Python之數據加密與解密及相關操作