Python实现类似文件合并

目录
  1. 核心程序
    1. Open
    2. File
  2. 并行程序
    1. 删除用过文件

​ 之前MPI并行计算,由于涉及到I/O,所以采用了分散文件,但是后续的计算还是需要把文件组合起来,感觉这个虽然简单,但是还是蛮常用的,所以记录一下

采用Python语言,怕涉及的工作量大,所以给出了一个多进程的版本,速度快些

核心程序

1
2
3
4
5
6
7
8
9
try:
fp = open(typestr,'r')
except:
continue
for line in fp:
fq = open(fileini,'a')
fq.write(line)
fp.close()
fq.close()

这里再贴出Python中open的mode类:

Open

Mode Description
r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。
r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
w 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
w+ 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

File

file对象的方法:

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

并行程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
from multiprocessing import Process
#class txtCombine():
def txtMain(strarr):
for strini in strarr:
for i in range(15):
strtwo = strini + str(i)
for j in range(1,5):
typestr = getpath(strtwo,j)
fileini = getpath(strini,j)
try:
fp = open(typestr,'r')
except:
continue
for line in fp:
fq = open(fileini,'a')
fq.write(line)
fp.close()
fq.close()

def getpath(typestr,num):
header=r'D:\Program\psgrnpscmp\Model2\gf20160124'+'\\'
if num == 1:
trail = '.cl'
elif num == 2:
trail = '.ds'
elif num == 3:
trail = '.ep'
else:
trail = '.ss'
typestr = header+typestr+trail
return typestr
if __name__ == '__main__':
# txtC = txtCombine()
# txtC.txtMain()
typearr = ['uz','ur','ut','szz','srr','stt','szr','srt'\
,'stz','tr','tt','rot','gd','gr']
p1 = Process(target=txtMain, args=(typearr[0:4],))
p2 = Process(target=txtMain, args=(typearr[4:8],))
p3 = Process(target=txtMain, args=(typearr[8:12],))
p4 = Process(target=txtMain, args=(typearr[12:14],))
p1.start()
p2.start()
p3.start()
p4.start()

​ 多少个进程可以根据自己需要和自身电脑性能来定制,这里只给出4进程。

删除用过文件

如果需要拼接完后删除。

1
2
3
4
import os
os.remove(path) #remove file
os.rmdir(path) #remove filedirectory
os.unlink(path) #similar to remove. But this one will report an error when delete a file using