Python切割大日志文件几种方法
背景
工作线上报错了,找运维下载了线上的日志文件排查问题,但是日志文件太大了,没办法用NotePad++打开,于是乎想着要切割一下日志文件
方法一:指定目标文件数量分割
import os # 要分割的文件 sourceFileName = normal-app.log # 分割的文件个数 fileNum = 10 def cutFile(): print("正在读取文件...") sourceFileData = open(sourceFileName, r, encoding=utf-8) ListOfLine = sourceFileData.read().splitlines() # 将读取的文件内容按行分割,然后存到一个列表中 totalLine = len(ListOfLine) print("文件共有" + str(totalLine) + "行") print("请输入需要将文件分割的个数:") p = totalLine//fileNum + 1 print("需要将文件分成"+str(fileNum)+"个子文件") print("每个文件最多有"+str(p)+"行") print("开始进行分割···") for i in range(fileNum): destFileName = os.path.splitext(sourceFileName)[ 0] + "_" + str(i + 1)+".log" print("正在生成子文件" + destFileName) destFileData = open(destFileName, "w", encoding=utf-8) if(i == fileNum-1): for line in ListOfLine[i*p:]: destFileData.write(line+ ) else: for line in ListOfLine[i*p:(i+1)*p]: destFileData.write(line+ ) destFileData.close() print("分割完成") if __name__ == __main__: cutFile()
方法二:指定文件大小分割
这种方法是按照大小分割文件,会存在同一行被分割在两个文件中的情况
import os filename = "normal-app.log" # 需要进行分割的文件 size = 10000000 # 分割大小10M def createSubFile(srcName, sub, buf): [des_filename, extname] = os.path.splitext(srcName) filename = des_filename + _ + str(sub) + extname print(正在生成子文件: %s % filename) with open(filename, wb) as fout: fout.write(buf) return sub+1 def cutFile(filename, size): with open(filename, rb) as fin: buf = fin.read(size) sub = 1 while len(buf) > 0: sub = createSubFile(filename, sub, buf) buf = fin.read(size) print("ok") if __name__ == "__main__": cutFile(filename, size)
方法三:指定目标行数分割
import os # 要分割的文件 sourceFileName = normal-app.log # 定义分割的行数 lineNum = 100000 def cutFile(): print("正在读取文件...") sourceFileData = open(sourceFileName, r, encoding=utf-8) ListOfLine = sourceFileData.read().splitlines() # 将读取的文件内容按行分割,然后存到一个列表中 totalLine = len(ListOfLine) print("文件共有" + str(totalLine) + "行") print("请输入需要将文件分割的个数:") fileNum = totalLine//lineNum + 1 print("需要将文件分成"+str(fileNum)+"个子文件") print("开始进行分割···") for i in range(fileNum): destFileName = os.path.splitext(sourceFileName)[ 0] + "_" + str(i + 1)+".log" print("正在生成子文件" + destFileName) destFileData = open(destFileName, "w", encoding=utf-8) if(i == fileNum-1): for line in ListOfLine[i*lineNum:]: destFileData.write(line+ ) else: for line in ListOfLine[i*lineNum:(i+1)*lineNum]: destFileData.write(line+ ) destFileData.close() print("分割完成") if __name__ == __main__: cutFile()