代码环境:python3.7.3 ---MacBook
记录时间:2019/7/1
代码目的:对大批量数据(40000个TXT文件进行数据分析处理)
主要分为三部分:
- 解析文件路径,读入
- 每读入一个TXT,处理它们每行数据
- 将处理结果存入一个TXT输出
import numpy as np
import pandas as pd
import re
import datetime
import time
import os #read txt
import linecache # read target line function
#### 第一部分 ####
root = '/Users/wangwenzhuo/Desktop/train/' # 这个地址要改(这里我在Mac上写的)
file_names = os.listdir(root) # 读取所有txt文件名
file_ob_list = [] # 定义列表存放txt文件名
file_name_list=[] # 提取"区域号"和"类型号"
list1=[]
list2=[]
for file_name in file_names: # 循环地给这520个文件名加上它前面的路径,以得到它的具体路径
fileob = root + file_name
file_ob_list.append(fileob) # 将路径追加到列表中存储 ['C:\\tcga\\datapro\\11\\1.txt','C:\\tcga\\datapro\\11\\2.txt',...](win下)
pattern = re.compile(r'\d+') # 用于匹配至少一个数字
m = pattern.match(file_name, 0, 6) # 匹配area
list1.append(m.group(0))
n=pattern.match(file_name,7,10) # 匹配kind
list2.append(n.group(0))
file_name_list.append(dict(zip(list1, list2))) # area : kind
#print("所有文件:",file_ob_list,"\n文件个数:",len(file_ob_list),"\n")
total_txt = [] # 记录一个txt的用户总访问次数 累计时间差 访问频率
#### 第二部分 ####
for file_ob in file_ob_list: # file_ob_list是所有文件(比如10个txt)对象组成的列表,for用来循环读取每一个文件,读取一个文件的方式是一行行读入,每次循环一次for就读取所有文件的某一行,因为这一行的第一列都是基因名称,都是一样的
total_visit_time = 0
total_delta = 0
total_frequent = 0
u = []
total_line = len(open(file_ob).readlines()) # calculate the line of txt
print("文件名:", file_ob, "\t行数(用户数):", total_line)
line_num = 1 # from 1st line
while line_num <= total_line: # line_num是当前读完行数
count = 0 # 一个用户访问次数
delta = 0 # 一个用户访问间隔总和
pvisit = [] # 一个用户所有的时间信息
#print("\n===person", line_num, "===")
line = linecache.getline(file_ob, line_num) # 读取第line_num行,定位用户
line = line.strip() # 去掉这一行最后一个\n
if line is None or len(line) == 0:
break
a = line.split(' ')[1]
b = a.split(',')
for i in b:
c = i.split('&')
e = c[1].split('|')
for j in e:
count = count + 1 # count是访问量
f = c[0] + j # 字符串形式拼接
time = datetime.datetime.strptime(f, "%Y%m%d%H")
pvisit.append(time)
if count > 1:
delta = delta + (int)((pvisit[count - 1] - pvisit[count - 2]).days * 24 + (
pvisit[count - 1] - pvisit[count - 2]).seconds / 3600)
#print("访问时间:", pvisit[count - 1])
pattern = re.compile(r'\d+') # 用于匹配至少一个数字
area = pattern.match(file_ob, 33, 40) # 匹配area
kind = pattern.match(file_ob, 40, 43) # 匹配kind
total_visit_time = total_visit_time + count
total_delta = total_delta + delta
line_num = line_num + 1
u.append(area.group(0))
u.append(kind.group(0))
u.append(str(total_line))
u.append(str(total_visit_time))
u.append(str(total_delta))
u.append(str(float(total_delta / total_visit_time)))
#表示成字典形式
# list1 = ['区域号', '类型号', '区域内用户数', '总访问次数', '累计访问间隔', '访问频率']
# total_txt.append(dict(zip(list1, u)))
# print(dict(zip(list1, u)))
#表示成列表形式(生成txt查看)
total_txt.append(u)
print(total_txt)
#### 第三部分 ####
f = open("/Users/wangwenzhuo/Desktop/1.txt", "w+") # 创建存放数据的文件
for i, p in enumerate(total_txt): # 将数据写入文件,i是enumerate()函数返回的ulist的某个元素p(就是一行数据,如['ENSG00000242268.2','0.0','0.10']从第一个开始)开始的序号(0,1,2等)
print(i) # 显示一下打印到了第多少行
for j, q in enumerate(p): # 读取p(如['ENSG00000242268.2','0.0','0.10'])中的每一个元素
f.write(str(q)+"\t") # 将这个元素写到txt中,每写一个加入一个“\t”(它代表excel中的一根竖线)
f.write("\n") # 每写完一行,就写入一个换行符"\n",好使的接下来的数据写入到第二行
f.close() # 操作完一个文件后应该将它关闭
【草稿:实现读取单个TXT的每一行】
#############2019-6-13 在txt文件上实现读取多行##############
# ulist = [] #记录一个用户的总访问次数 累计时间差 访问频率
#
# root='/Users/wangwenzhuo/Desktop/1.txt'
# line_num=1
# total_line = len(open(root).readlines()) #calculate the line of txt
# while line_num <= total_line: #line_num是当前读完行数
# u = [] # 一个用户的所有信息
# count = 0 # 一个用户访问次数
# delta = 0 # 一个用户访问间隔总和
# pvisit = [] # 一个用户所有的时间信息
#
# print("\n===person",line_num,"===")
# line = linecache.getline(root, line_num) #读取第line_num行,定位用户
# line = line.strip() #去掉这一行最后一个\n
# if line is None or len(line) == 0:
# break
#
# a = line.split(' ')[1]
# b = a.split(',')
# for i in b:
# c = i.split('&')
# e = c[1].split('|')
# for j in e:
# count = count + 1 #count是访问量
# f = c[0] + j # 字符串形式拼接
# time = datetime.datetime.strptime(f, "%Y%m%d%H")
# pvisit.append(time)
# if count > 1:
# delta = delta + (int)((pvisit[count - 1] - pvisit[count - 2]).days * 24 + (pvisit[count - 1] - pvisit[count - 2]).seconds /3600)
# print("访问时间:",pvisit[count - 1])
#
# line_num = line_num + 1
# u.append(line_num)
# u.append(count)
# u.append(delta)
# u.append(float(delta/count))
# ulist.append(u)
# print("用户",u[0]-1,"的访问次数:",u[1],"\t累计时间差(小时):",u[2],"\t访问频率:",u[3])
#
# print(ulist)