总结一下自己最近比较经常用到的一些文件处理方面的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)
# 按行读取txt内容存储为list
lines = open(txt_path, 'r').read().splitlines()
# 写入txt(w/a)
f = open(txt_path,"w")
f.write("xxx")
f.close()
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.(未完待续)