開發需求:應項目需要,要將記錄成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')