有一批断层数据,大概长这个样子:
前面有很多表头,后面的数据排列很规则,每一个“n5w3d_6F”都是一条断层的名字,每个断层又分为很多歌segment,数据一共有数万行,现在需要对这些数据进行处理,要讲每一个断层单独命名并保存,删掉后两列,在每个segment的每行数据后面添加数据位置(断层起始点记为1、中间点记为2、终止点记为3)和断层名字(每个segment单独排序)。
先对断层数据拆分,以“n5w3d_6F”为关键词检索并切割。
# -*- coding: utf-8 -*-
# Author: Wuy
# Python 3.6
# 主要实现目的:
# 拆分地层数据,以关键词“n5w3d_6_F”切分txt文件,并将每一个分段单独保存为以特定名字命名的txt文本中
# 第一个关键词之前的内容不用保存
target_dir = 'Y:/断层拆分/'
key = 'n5w3d_6_F'
def Fun():
line_num = 0
output_num = 0
key_line_list = []
get_key_list = []
f = open('Y:/n5w3d_fault - 副本.txt','r')
data = f.readlines()
f.close()
find_list = []
for eachline in data:
if key in eachline:
key_line_list.append(line_num)
text = eachline[eachline.rfind(key):15]
get_key_list.append(text)
print('第%s行:%s' % (line_num + 1,text))
find_list.append('第%s行:%s' % (line_num + 1,text))
n = len(key_line_list)
if n >= 2:
output_num += 1
output_lines = data[key_line_list[n-2]:key_line_list[n-1]]
output_path = target_dir + get_key_list[n-2] + '-' + str(output_num) + '.txt'
with open(output_path,'w') as v:
for line in output_lines:
v.write(line)
print('---------------------------------------------')
print('保存文件:%s' % (get_key_list[n-2] + '-' + str(output_num) + '.txt'))
print('---------------------------------------------')
line_num += 1
output_num += 1
output_lines = data[key_line_list[n-1]:]
output_path = target_dir + get_key_list[n-1] + '-' + str(output_num) + '.txt'
with open(output_path,'w') as v:
for line in output_lines:
v.write(line)
print('---------------------------------------------')
print('保存文件:%s' % (get_key_list[n-1] + '-' + str(output_num) + '.txt'))
print('---------------------------------------------')
with open('Y:/关键词出现行数.txt','w') as v:
for line in find_list:
v.write(line + '\n')
# 记录关键词出现行数,仅用于后期检验数据
print('---------------------------------------------')
print('保存文件:%s' % (target_dir + '关键词出现行数.txt'))
print('---------------------------------------------')
if __name__ == "__main__":
Fun()
上一步,将每个断层单独保存为txt文件之后,需要分别对数据做删除和添加数据的处理。
思路是,先对每个segment进行拆分,处理完毕在合并输出,遍历文件夹中所有断层的txt文件。
# -*- coding: utf-8 -*-
# Author: Wuy
# Python 3.6
# 实现目标:
# 对每一个提前拆分好的文档进行处理,每一个文档代表一个断层数据
# 保留每个断层数据的前三列,删除不是数据的表头内容
# 对每个fault segment添加开始点(1)、中间点(2)和终止点(3)标记,对每个segment单独命名,规则断层名+序号
import os
from datetime import datetime
file_dir = 'Y:/断层拆分/'
output_dir = 'Y:/已处理/'
key = 'Fault Segment'
def split_file(file_path):
print('拆分开始')
print(datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
f = open(file_path,'r')
lines = f.readlines()
f.close()
fault_name = lines[0].split(' ')[0] # 获取断层名字
key_line_list = [] # 用于记录检索到关键词的行号
output_list = [] # 用于记录拆分好的数据段
line_num = 0 # 用于记录行号
segment_num = 0 # 记录数据段数目
n = 0
for eachline in lines:
if key in eachline:
key_line_list.append(line_num)
n = len(key_line_list) # n为检索到关键词的数目
if n >= 2:
k3 = [] # 用于记录每一个数据段
# segment_num += 1
# 获取最后两个关键词之间的内容,k1实际为list(),每个元素每行数据,格式为str()
k1 = lines[key_line_list[n-2] + 3:key_line_list[n-1]]
# +3是因为包括关键词所在行还有三行表头
for each_line in k1:
k2 = each_line[:48] # 保留前三列数据,48之后的字符删去
k3.append(k2)
output_list.append(k3)
line_num += 1
# 还有最后一部分数据需要提取
if n >= 1:
segment_num += 1
k3 = []
k1 = lines[key_line_list[n-1] + 3:-1] # -1是因为需要删除最后一行
for each_line in k1:
k2 = each_line[:48] # 保留前三列数据,48之后的字符删去
k3.append(k2)
output_list.append(k3)
# output为一个文件中所有fault segment的数据集合
# 为K3里每一行添加1/2/3标注和断层名字标注,尤其注意需要添加\n(回车)
for each_segment in output_list:
if len(each_segment) >= 3:
for i in range(len(each_segment)):
if i == 0:
each_segment[0] = each_segment[0] + ' 1' + ' ' + fault_name + '-' + str(output_list.index(each_segment) + 1) + '\n'
elif i == len(each_segment) - 1:
each_segment[-1] = each_segment[-1] + ' 3' + ' ' + fault_name + '-' + str(output_list.index(each_segment) + 1) + '\n'
if i in range(1, len(each_segment) - 1):
each_segment[i] = each_segment[i] + ' 2' + ' ' + fault_name + '-' + str(output_list.index(each_segment) + 1) + '\n'
elif len(each_segment) == 2:
each_segment[0] = each_segment[0] + ' 1' + ' ' + fault_name + '-' + str(output_list.index(each_segment) + 1) + '\n'
each_segment[-1] = each_segment[-1] + ' 3' + ' ' + fault_name + '-' + str(output_list.index(each_segment) + 1) + '\n'
else:
print('%s断层出错,数据行数小于2' % (fault_name))
# 写入文本
save_path = output_dir + fault_name +'.dat'
with open(save_path,'w') as v:
for each_list in output_list:
for each_line in each_list:
if output_list.index(each_list) == len(output_list) - 1 and each_list.index(each_line) == len(each_list) - 1:
v.write(each_line.split('\n')[0])
else:
v.write(each_line)
print('---------------------------------------------')
print('保存文件:%s' % (fault_name + '.dat'))
print('---------------------------------------------')
print('完成:%s' % (fault_name))
print(datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
def all_files_path(rootDir):
filepaths = []
for root, dirs, files in os.walk(rootDir): # 分别代表根目录、文件夹、文件
for file in files: # 遍历文件
file_path = os.path.join(root, file) # 获取文件绝对路径
filepaths.append(file_path) # 将文件路径添加进列表
return filepaths
if __name__ == "__main__":
filepaths_list = all_files_path(file_dir)
for each_path in filepaths_list:
split_file(each_path)
注意,代码中的文件路径是否正确。