因研究工作,需批处理类文本文件,删除异常数据,然后重新写入新文件,程序如下:
(因对NumPy的数组操作和Pandas的DataFrame对象操作不熟悉,故此程序基本上是用Python自带库编写)
涉及重点操作:
1、把连续空格替换为逗号row1 = ",".join(row.split())
2、遍历循环列表删除多个元素,应:
倒序循环for i in range(len(ysb)-1,-1,-1):
;
遍历拷贝的list,操作原始的list:
num_list = [1, 2, 3, 4, 5]
for item in num_list[:]:
if item == 2:
num_list.remove(item)
原始的list是num_list,那么其实,num_list[:]是对原始的num_list的一个拷贝,是一个新的list,所以,我们遍历新的list,而删除原始的list中的元素,则既不会引起索引溢出,最后又能够得到想要的最终结果。此方法的缺点可能是,对于过大的list,拷贝后可能很占内存。那么对于这种情况,可以用倒序遍历的方法来实现。
参考:Python的list循环遍历中,删除数据的正确方法
3、列表的每个元素由字符串变为数字row_num = [eval(i) for i in row]
4、把双重列表导出:使用numpy数组;json方法
5、使用os模块读取文件夹的所有文件
本程序使用的是程序所在当前文件夹,若要访问计算机其他文件夹: os.listdir(r'D:\Code\Matlab\kuang_data\yuanshibo\20180106')
参考:【python】如何批量读取文件夹的所有文件数据,os模块与open函数结合使用实例
python批量读取txt文件为DataFrame
import os # 载入os模块以操作文件
# import glob
## 定义函数,以便调用
def ysbprocess(filename):
f = open(filename, "r")
data = f.read() # 返回的data是一个字符串对象,包含分行符\n
rows = data.split("\n") # 返回字符串列表
ysb = []
for row in rows:
row1 = ",".join(row.split()) ## 把连续空格替换为逗号
ysb.append(row1.split(",")) # ysb是元素为字符串的双重列表(二维列表)
col_num = len(ysb[0])+1
for i in range(len(ysb)-1,-1,-1): ## 遍历循环列表删除多个元素,倒序循环
if len(ysb[i]) < col_num:
del ysb[i] # 删除ysb1中列数不正常的行
ysb_num=[]
for row in ysb:
row_num = [eval(i) for i in row]
ysb_num.append(row_num) ## 把ysb中的元素由字符串变为数字
# import numpy as np
# ysb_nparray = np.asarray(ysb_num)
# np.savetxt("A01_180121_040724716.txt",ysb_nparray) # numpy数组方法会造成数字位数特别长,待解决(方法:指定fmt参数)
import json # 使用json方法,最后一行是空的,仍需改进
file = open(filename[:29]+".json", 'w')
for row in ysb_num:
for i in range(len(row)):
if i < len(row)-1:
json_num = json.dumps(row[i])
file.write(json_num+' ') # 非每行最后加空格
else:
json_num = json.dumps(row[i])
file.write(json_num+'\n') # 每行最后加换行符
file.close()
folderlist = ['20170307', '20170921', '20180106', '20180121']
for item in folderlist:
filelist = os.listdir(item) # 返回字符串列表,其元素为相应文件夹下的所有文件名
for i in range(len(filelist)):
ysbprocess(item+"/"+filelist[i]) # 调用函数对文件逐个处理
注:array和asarray都可以将结构数据转化为ndarray,但是主要区别就是当数据源是ndarray时,array仍然会copy出一个副本,占用新的内存,但asarray不会。
参考:numpy中array和asarray的区别
np.savetxt(frame, array, fmt='%.18e', delimiter=None)
• frame : 文件、字符串或产生器,可以是.gz或.bz2的压缩文件
• array : 存入文件的数组
• fmt : 写入文件的格式,例如:%d %.2f %.18e
• delimiter : 分割字符串,默认是任何空格
二重列表写入到csv文件中 参考:python列表、字典与csv