-
Notifications
You must be signed in to change notification settings - Fork 0
/
splitjoin.py
115 lines (81 loc) · 2.91 KB
/
splitjoin.py
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
'''
splitjoin.py
sonicskye@2018
The functions are used to split and join files
based on:
https://stonesoupprogramming.com/2017/09/16/python-split-and-join-file/
with modification by adding natural sort
'''
import os
import re
# https://stackoverflow.com/questions/11150239/python-natural-sorting
def natural_sort(l):
convert = lambda text: int(text) if text.isdigit() else text.lower()
alphanum_key = lambda key: [convert(c) for c in re.split('([0-9]+)', key)]
return sorted(l, key = alphanum_key)
def split(source, dest_folder, write_size):
# Make a destination folder if it doesn't exist yet
if not os.path.exists(dest_folder):
os.mkdir(dest_folder)
else:
# Otherwise clean out all files in the destination folder
for file in os.listdir(dest_folder):
os.remove(os.path.join(dest_folder, file))
partnum = 0
# Open the source file in binary mode
input_file = open(source, 'rb')
while True:
# Read a portion of the input file
chunk = input_file.read(write_size)
# End the loop if we have hit EOF
if not chunk:
break
# Increment partnum
partnum += 1
# Create a new file name
filename = os.path.join(dest_folder, ('part-' + str(partnum)))
# Create a destination file
dest_file = open(filename, 'wb')
# Write to this portion of the destination file
dest_file.write(chunk)
# Explicitly close
dest_file.close()
# Explicitly close
input_file.close()
# Return the number of files created by the split
return partnum
def join(source_dir, dest_file, read_size):
# Create a new destination file
output_file = open(dest_file, 'wb')
# Get a list of the file parts
parts = os.listdir(source_dir)
# Sort them by name (remember that the order num is part of the file name)
# should use natural sort
#parts.sort()
parts = natural_sort(parts)
# Go through each portion one by one
for file in parts:
# Assemble the full path to the file
path = os.path.join(source_dir, file)
# Open the part
input_file = open(path, 'rb')
while True:
# Read all bytes of the part
bytes = input_file.read(read_size)
# Break out of loop if we are at end of file
if not bytes:
break
# Write the bytes to the output file
output_file.write(bytes)
# Close the input file
input_file.close()
# Close the output file
output_file.close()
# example
'''
imageFilePath = os.path.join(os.path.dirname(__file__), 'cryptocurrency.jpg')
destinationFolderPath = os.path.join(os.path.dirname(__file__), 'tmp')
imageFilePath2 = os.path.join(os.path.dirname(__file__), 'cryptocurrency2.jpg')
split(imageFilePath, destinationFolderPath, 2350)
join(destinationFolderPath, imageFilePath2, 4700)
'''