總結一下自己最近比較經常用到的一些文件處理方面的python代碼,方便以後使用。
文件處理常用模塊:
# 獲取文件夾路徑下的所有文件名組成的列表
fileList = os.listdir(file_path) # ['test1.txt', 'test2.txt', 'test3.txt']
# 把fileName重命名爲newName
os.rename(fileName, newName)
# 把file內容加到base_dir後面
os.path.join(base_dir, file) # /path/files/ --> /path/files/test1.txt
# 刪除文件
os.remove(file_path)
# 刪除空文件夾
os.rmdir(files_path)
# 刪除文件夾
shutil.rmtree(files_path)
# 複製文件
shutil.copy(file_path1, file_path2)
1. 批量修改文件名
修改files文件夾下的3個文件名爲4,5,6:
import os
import re
import sys
file_path = "C\\Users\\lakuite\\Desktop\\files"
fileList = os.listdir(file_path)
print("修改前:" + str(fileList))
# 得到進程當前工作目錄
currentpath = os.getcwd()
# 將當前工作目錄修改爲待修改文件夾的位置
os.chdir(file_path)
num = 4
# 遍歷文件夾中所有文件
for fileName in fileList:
# 匹配文件名正則表達式
pat = ".+\.(txt)" # .+表示多個任意字符,\.表示.,即匹配*****.txt(後綴爲.txt的文件)
# 進行匹配
pattern = re.findall(pat, fileName)
# 文件重新命名
os.rename(fileName, str(fileName)[:4]+str(num)+'.'+pattern[0])
num = num + 1
print("***************************************")
# 改回程序運行前的工作目錄
os.chdir(currentpath)
# 刷新
sys.stdin.flush()
print("修改後:" + str(os.listdir(file_path)))
輸出結果:
修改前:['test1.txt', 'test2.txt', 'test3.txt']
***************************************
修改後:['test4.txt', 'test5.txt', 'test6.txt']
2. 批量移動文件
這個本質上直接進到文件夾內複製粘貼就行,主要是應用在例如對文件內容有一些篩選條件的移動中。
(1)把files中的文件按照其名稱分類移動到對應的文件夾中,執行前路徑如圖:
代碼如下:
import os
import shutil
path = "C:\\Users\\lakuite\\Desktop\\files"
# 得到進程當前工作目錄
currentpath = os.getcwd()
# 將當前工作目錄修改爲待修改文件夾的位置,這樣在rename的時候只用輸文件名,默認就是這個路徑下的
os.chdir(path)
fname_list = os.listdir(path) # 文件名稱
for fname in fname_list:
file_name = fname[:-5] # 要創建的文件夾名(.txt佔4位)
file_path = os.path.join(path, file_name) # 文件夾路徑
isExists = os.path.exists(file_path)
if not isExists: # 不存在
os.makedirs(file_path)
pic_path = os.path.join(path, fname) # 文件路徑
shutil.copy(pic_path, os.path.join(file_path, fname)) # 複製文件
os.remove(pic_path) # 刪除源文件
# 改回程序運行前的工作目錄
os.chdir(currentpath)
# 刷新
sys.stdin.flush()
執行後結果:
(2)把files文件夾下各子文件夾的內容都放到files下,並帶有其文件夾的名稱,刪除所有文件夾。
就是把(1)實現的效果再變回去,代碼如下:
import os
import shutil
path = "C:\\Users\\lakuite\\Desktop\\files"
fname_list = os.listdir(path) # 文件夾名稱 ['test', 'pic']
for fname in fname_list:
ff_path = path+'\\'+fname # 文件夾路徑
file_list = os.listdir(ff_path) # 文件名稱 ['1.txt', '2.txt', '3.txt']
for f in file_list:
new_name = fname+f
# print(new_name)
f_path = ff_path+'\\'+f
shutil.copy(f_path, path+'\\'+new_name)
os.remove(f_path)
os.rmdir(ff_path) # 刪除空文件夾
執行後結果:
其中,os.rmdir() 僅用於刪除空文件夾, 如果要刪除非空文件夾,可用 shutil.rmtree() 。
5. 刪除txt文件中不存在某特定關鍵詞的行
刪除 test.txt 中沒有 main 的行,txt內容如下:
# test.txt
2020.03.20 --> 2020.03.21, sdjgfdhgghd main 47243656 end alsone
2020.02.12 --> 2020.02.23, gjhdffh hh 123575 fghhthh
2020.03.22 --> 2020.03.23, dsggfhdghdasdgshfjghjdf main 1134076 end mnbcvu
2020.01.23 --> 2020.01.31, uihdfghjffh main 124364 end fjkfythgb
2020.03.24 --> 2020.03.25, sdggfdgffsdgsdf main 236432634 end slyev
2020.03.26 --> 2020.03.27, gdfgf fshjryt 46234 oomd
代碼如下 :
# 把txt文件中不含有str1的行都刪除
def delete_line(path, str1):
with open(path, "r", encoding="utf-8") as f:
lines = f.readlines()
with open(path, "w", encoding="utf-8") as f_w:
for line in lines:
if str1 not in line:
line = line.replace(line, "")
f_w.write(line)
if __name__ == '__main__':
path = 'C:\\Users\\lakuite\\Desktop\\test.txt'
str1 = 'main'
delete_line(path, str1)
- lines和line均爲string類型,lines存儲了整個txt的內容,line存儲了txt中每一行的內容。
- 用 in 和 not in 來判斷一個字符串中是否包含了另一個字符串。
- str.replace(str1, str2)爲把str1全部轉換成str2,當初str2爲''(空)時,即刪除。
執行後的結果:
4. 替換txt文件中特定關鍵詞
提取test.txt中的2個日期和main..end中間的數字,各行數據之間用空格隔開,txt文件內容如下:
# test.txt
2020.03.20 --> 2020.03.21, sdjgfdhgghd main 47243656 end alsone
2020.03.22 --> 2020.03.23, dsggfhdghdasdgshfjghjdf main 1134076 end mnbcvu
2020.01.23 --> 2020.01.31, uihdfghjffh main 124364 end fjkfythgb
2020.03.24 --> 2020.03.25, sdggfdgffsdgsdf main 236432634 end slyev
代碼如下:
import os
import re
# 把txt文件中所有的str1改成str2
def change(infile, outfile, str1, str2):
infopen = open(infile, 'r',encoding="utf-8")
outfopen = open(outfile, 'w',encoding="utf-8")
db = infopen.read()
# outfopen.write(db.replace(str1,str2))
outfopen.write(re.sub(str1, str2, db))
# print(type(db))
infopen.close()
outfopen.close()
if __name__ == '__main__':
path1 = 'C:\\Users\\lakuite\\Desktop\\test.txt'
path2 = 'C:\\Users\\lakuite\\Desktop\\test_new.txt'
strs1 = [r' end.*', r', .*main ', ' --> ']
strs2 = ['', ' ', ' ']
for i, s in enumerate(strs1):
change(path1, path2, s, strs2[i])
os.remove(path1)
os.rename(path2, path1)
執行後結果:
其中re.sub(str1, str2, text)表示將text中所有的str1字符串改爲str2字符串,str1支持正則表達式。
5. 把txt內容轉爲excel表格
把test.txt中數據存放到excel表格中,並且存放順序爲第一列數字,第二三列時期,test.txt內容如下:
2020.03.20 2020.03.21 47243656
2020.03.22 2020.03.23 1134076
2020.01.23 2020.01.31 124364
2020.03.24 2020.03.25 236432634
數據格式需要以空格隔開,代碼如下:
import numpy as np
import pandas as pd
# txt文件內用空格空開,默認數據類型是float
data_txt = np.loadtxt('C:\\Users\\lakuite\\Desktop\\test.txt', dtype=str)
# 存到DataFrame裏
data_txtDF = pd.DataFrame(data_txt)
# cols = list(data_txtDF) # 0,1,2--> 2,0,1
order = [2, 0, 1]
data_txtDF = data_txtDF.loc[:, order]
# 導出到excel,index表示是否需要行名,header表示是否需要列名
data_txtDF.to_excel('C:\\Users\\lakuite\\Desktop\\test.xlsx', index=False, header=False)
執行後結果:
6.(未完待續)
參考文檔
[1] python批量修改一個文件夾下含多個文件夾中的所有圖片名稱(代碼)
[3] python取出文本中含有指定關鍵詞的行並修改爲指定內容
[4] Python3中替換指定字符:replace()和正則表達式
[7] Notepad++編輯器對文本行首、行尾加上固定字符;每行之間增加空行