python文件處理常用代碼

總結一下自己最近比較經常用到的一些文件處理方面的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批量修改一個文件夾下含多個文件夾中的所有圖片名稱(代碼)

[2] Python 刪除滿足條件的某些行

[3] python取出文本中含有指定關鍵詞的行並修改爲指定內容

[4] Python3中替換指定字符:replace()和正則表達式

[5] Python 正則表達式

[6] re --- 正則表達式操作

[7] Notepad++編輯器對文本行首、行尾加上固定字符;每行之間增加空行

[8] python 快速把超大txt文件轉存爲csv

[9] 【Python】DataFrame輸出爲csv\txt\xlsx文件

[10] 更改pandas dataframe 列的順序

[11] python中刪除list中某指定元素

[12] python獲得兩個數組交集、並集、差集的方法

[13] pandas中str格式的時間之間進行相減

[14] python實現對excel數據進行修改/添加

[15] python,向已經存在數據的excel中添加數據

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章