Python批处理同类型文件(读入+修改+写入新文件)

因研究工作,需批处理类文本文件,删除异常数据,然后重新写入新文件,程序如下:
(因对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

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值