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中添加数据

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