[python]MergeTxt按列合并同一个文件下多个txt文件
阅读原文时间:2023年07月10日阅读:1

开发需求:应项目需要,要将记录成txt的实验数据进行按列合并(也即为不同文件上下合并),从而进行机器学习训练.

实验数据类似如此

模拟验证数据

1.txt
*****1*****
abcdefghijklmn
opqrstuvwxyz
hhhhhhhhhhhhhhhhhhh
2.txt
*****2*****
12345678910
11121314151
123456897897
1231564564879
2132564644561
3.txt
*****3*****
wkhdwadadfa
wdawadwfafa
fggfwgwgqws
sssssssssss
4.txt
*****4*****
wdawadwfafa
fggfwgwgqws
sssssssssss
wkhdwadadfa

运行结果

最终结果

# -*- coding:utf-8*-
import sys

import os
import os.path
import time

time_start = time.time()
'''
    “a” 以“追加”模式打开, (从 EOF 开始, 必要时创建新文件)
    “a+” 以”读写”模式打开
    “ab” 以”二进制 追加”模式打开
    “ab+” 以”二进制 读写”模式打开

    “w” 以”写”的方式打开
    “w+” 以“读写”模式打开
    “wb” 以“二进制 写”模式打开
    “wb+” 以“二进制 读写”模式打开

    “r+” 以”读写”模式打开
    “rb” 以”二进制 读”模式打开
    “rb+” 以”二进制 读写”模式打开

    rU 或 Ua 以”读”方式打开, 同时提供通用换行符支持 (PEP 278)
    1、使用“w”模式。文件若存在,首先要清空,然后重新创建
    2、使用“a”模式。把所有要写入文件的数据都追加到文件的末尾,即使你使用了seek()指向文件的其他地方,如果文件不存在,将自动被创建。

    3、f.read([size]) :size未指定则返回整个文件,如果文件大小>2倍内存则有问题。f.read()读到文件尾时返回”“(空字串)
    4、file.readline() 返回一行
    5、file.readline([size]) 返回包含size行的列表,size 未指定则返回全部行
    6、”for line in f: print line” #通过迭代器访问
    7、f.write(“hello\n”) #如果要写入字符串以外的数据,先将他转换为字符串.
    8、f.tell() 返回一个整数,表示当前文件指针的位置(就是到文件头的比特数).
    9、f.seek(偏移量,[起始位置]) : 用来移动文件指针
    偏移量 : 单位“比特”,可正可负
    起始位置 : 0 -文件头, 默认值; 1 -当前位置; 2 -文件尾
    10、f.close() 关闭文件
'''

# 合并同一个文件夹下多个txt#
def MergeTxt(filepath='', outfile='', rmode='', ntag=False):
    '''
    @param filepath: 合并的文件目录
    @param outfile:  合并输出文件目录
    @param rmode:    读写模式
    @param ntag:     是否换行标记
    '''
    print('merge start')
    # open(path, ‘-模式 -‘, encoding =’UTF - 8’)
    k = open(filepath + outfile, rmode)
    for parent, dirnames, filenames in os.walk(filepath):
        # 需针对当前文件做升序排序,否则按照os.walk的规则,遍历列表是乱序的
        filenames.sort(key=None, reverse=False)
        for filepath in filenames:
            # filepath 即为遍历目录列表中当前文件路径
            # txtpath 即为所有文件夹的路径
            txtPath = os.path.join(parent, filepath)
            print('open file:', filepath)
            f = open(txtPath)
            if (ntag):
                k.write(f.read() + "\n")
            else:
                k.write(f.read())

    k.close()
    print('finished')

# 合并同一个文件夹下多个txt#
def MergeTxt_range(filepath='', outfile='', rmode='', ntag=False, range_start = 1, range_end = 31):
    '''
    @param filepath: 合并的文件目录
    @param outfile:  合并输出文件目录
    @param rmode:    读写模式
    @param ntag:     是否换行标记
    '''
    print('merge start')
    # open(path, ‘-模式 -‘, encoding =’UTF - 8’)
    k = open(filepath + outfile, rmode)
    for num in range(range_start, range_end):
        txtPath = filepath + str(num) + '.txt'
        print('txtpath', txtPath)
        f = open(txtPath)
        if (ntag):
            k.write(f.read() + "\n")
        else:
            k.write(f.read())

    k.close()
    print('finished')

if __name__ == '__main__':
    filepath = "/home/leoxae/PycharmProjects/Test/trainData/dragging/dragging_gz_train/"
    outfile = "dragging_gz_train.txt"
    rmode = 'a+'
    ntag = True
    MergeTxt_range(filepath, outfile, rmode, ntag,11,31)
    time_end = time.time()
    print(u'总共耗时:' + str(time_end - time_start) + 's')