闲来无事写点小程序自己乐呵乐呵~~~~
背景:
笔者去年暑假的时候为了督促自己学习,养成了使用TXT文件来记录每天的点滴,目的是提醒自己一直在努力,不要迷茫。但是暑假结束后,想要看看这个暑假自己一共做了啥,因此就想到了写一个小程序将这些日记都读到一个文件里面去,方便直观查看。
为此,首先要解决的是——使用实现读取目录所有文件的文件名并保存到txt文件代码。通过查阅资料并总结有两种方法:
方法一:使用os.listdir
import os
def ListFilesToTxt(dir,file,wildcard,recursion):
exts = wildcard.split(" ")
files = os.listdir(dir)
for name in files:
fullname=os.path.join(dir,name)
if(os.path.isdir(fullname) & recursion):
ListFilesToTxt(fullname,file,wildcard,recursion)
else:
for ext in exts:
if(name.endswith(ext)):
file.write(name + "\n")
break
def Test():
dir="C:/Users/zhuwenjing/Desktop/dairy/2_summerVacation"
outfile="binaries.txt"
wildcard = ".txt .exe .dll .lib"
file = open(outfile,"w")
if not file:
print ("cannot open the file %s for writing" % outfile)
ListFilesToTxt(dir,file,wildcard, 1)
file.close()
Test()
dir = "C:/Users/zhuwenjing/Desktop/dairy/2_summerVacation"
print os.listdir(dir)
方法2:使用os.walk
# 使用os.walk递归地对目录及子目录处理,每次返回的三项分别为:当前递归的目录,当前递归的目录下的所有子目录,
# 当前递归的目录下的所有文件。
import os
def ListFilesToTxt(dir,file,wildcard,recursion): #recursion控制递归深度,只递归当前目录(*****)
exts = wildcard.split(" ")
for root, subdirs, files in os.walk(dir):
for name in files:
for ext in exts:
if(name.endswith(ext)): # (*****)
file.write(name + "\n")
break
if(not recursion):
break
def Test():
dir=r"C:/Users/zhuwenjing/Desktop/dairy/2_summerVacation"
outfile="binaries.txt"
wildcard = ".txt .exe .dll .lib"
file = open(outfile,"w")
if not file:
print ("cannot open the file %s for writing" % outfile)
ListFilesToTxt(dir,file,wildcard, 0)
file.close()
Test()
以下是实现上面需求的小程序的代码:
1 将以天为单位记录的日记进行合并
将一个文件夹下的所有txt日记写到一个文件中
目标格式是:一行存储一天的日记
# -*- coding:utf-8 -*-
# 文件格式是:
# 20170711.txt
# 20170715.txt
# 20170717.txt
第一步:
import glob
import re
# 采用glob模块匹配出目标文件夹下的所有txt后缀名的文件
txt_filenames = glob.glob(r'C:\Users\zhuwenjing\Desktop\Diary\a\*.txt')
print( txt_filenames)
输出的结果是:
['C:\\Users\\zhuwenjing\\Desktop\\Diary\\a\\20170711.txt','C:\\Users\\zhuwenjing\\Desktop\\Diary\\a\\20170715.txt', 'C:\\Users\\zhuwenjing\\Desktop\\Diary\\a\\20170717.txt', 'C:\\Users\\zhuwenjing\\Desktop\\Diary\\a\\20170718.txt', 'C:\\Users\\zhuwenjing\\Desktop\\Diary\\a\\20170719.txt', 'C:\\Users\\zhuwenjing\\Desktop\\Diary\\a\\20170720.txt']
第二步:
# 采用re模块匹配出txt文件的文件名称
pattern = re.compile("a\\\(.*?)\.txt", re.S)
txtname = []
for i in txt_filenames:
name = re.findall(pattern, i )
txtname.append(name[0])
print(txtname)
输出的结果是:
['20170711', '20170715', '20170717', '20170718', '20170719', '20170720']
第三步:
# 将每个txt文件中的信息放在一行中,并存储到目标文件中
fileout = open(r'C:\Users\zhuwenjing\Desktop\Diary\AllDiary.txt','w+') # 注意:AllDiary.txt需要是已经创建过的文件
for i in range(len(txt_filenames)):
txt_file = open(txt_filenames[i], 'r') # 可以转码成txt_filenames[i].decode('utf-8'),也可以不转码
buf = txt_file.read() # the context of txt file saved to buf
content = buf.replace("\n", " ").strip()
p = txtname[i] + ' ' + content
fileout.write(p)
fileout.write('\n\n')
txt_file.close()
fileout.close()
2 将以周为单位记录的日记进行合并
目标:将一个文件夹下的所有txt日记写到一个文件中(一行是一周的日记)# 文件格式是:======================> 目标格式:
# 第1周周报20170226.txt [1, 20170226]
# 第2周工作计划.txt [2]
# 第2周周报20170305.txt [2, 20170305]
# 第3周工作计划.txt [3]
第一步:
import glob
import re
# 采用glob模块匹配出目标文件夹下的所有txt后缀名的文件
txt_filenames = glob.glob(r'C:\Users\zhuwenjing\Desktop\Diary\b\*.txt')
print( txt_filenames)
第二步:
# 采用re模块匹配出txt文件的文件名中的数字
pattern = re.compile("[0-9]+", re.S)
txtname = []
for i in txt_filenames:
name = re.findall(pattern, i )
name = map(int, name) # 将列表中的数据类型转成数值型
txtname.append(name)
第三步:
# 将文件名和列表中的日期信息进行对应匹配,目的是方便按照日期写入顺序排序
pp = zip(txtname,txt_filenames)
pp = sorted(pp)
第四步:
# 将每个txt文件中的信息放在一行中,并存储到目标文件中
fileout = open(r'C:\Users\zhuwenjing\Desktop\Diary\AllDiary1.txt','w+')
for i in range(len(pp)):
txt_file = open(pp[i][1], 'r') # 注意:这里直接读取文件名即可,不需要解码成utf-8的格式txt_filenames[i].decode('utf-8')
buf = txt_file.read() # the context of txt file saved to buf
content = buf.replace("\n", " ").strip()
p = str(pp[i][0]) + ' ' + content # 每行开始加上日期数据
fileout.write(p)
fileout.write('\n\n')
txt_file.close()
fileout.close()