# join files interactively
import os
def menu():
print("welcome to file joiner")
print()
print("you will need to specify the original file name")
filename =input("Enter the original name:")
return filename
def main():
try:
filename = menu()
metaFile = filename + ".meta"
infile = open(metaFile, "r")
metaInfo = infile.readlines()
splitsFilePrefix = metaInfo[0] + strip()
bufferSize = metaInfo[1].strip()
bufferSize = int(bufferSize)
splits = metaInfo[2] + strip()
splits = int(splits)
try:
os.remove("new" + filename)
except:
pass
outfile = open("new" + filename, "ab")
infile = open(splitsFilePrefix + str(0), "rb")
buffer = infile.read(bufferSize)
i = 0
while len(buffer):
outfile.write(buffer)
print(".", end="")
i = i+1
if i == splits:
break
splitsFilePrefix = metaInfo[0].strip()
splitsFilePrefix = splitsFilePrefix + str(i)
infile = open(splitsFilePrefix,"rb")
buffer = infile.read(bufferSize)
infile.close()
outfile.close()
print()
print("Files rejoined, File name is :new" + filename)
except:
print("An error Occured")
main()
答案 0 :(得分:0)
你还没有说出错。如果我们不知道它应该做什么,没有人可以帮助它如何运作。
我浏览了它,寻找语法错误,无法看到。
我看到了+ str(0)
并想知道它是否只打开了第一个文件。事实证明它并没有,它也会打开其他文件。
我看到splitsFilePrefix = splitsFilePrefix + str(i)
并认为它可能会生成文件名xyz1
,xyz12
,xyz123
,但不会通过重新阅读来处理每次都有元文件。
我看到了大try: {everything} except: {error}
代码,它将捕获每个可能有用的错误消息,并将其替换为无用的错误消息。
我确定该计划的目的是:
。
give it a filename, it opens:
filename.meta
which is structured:
filename_prefix
buffer_size
number_of_parts
then loops through
filename_prefix0
filename_prefix1
filename_prefix..
and reinvents the wheel of `cat` and `copy` and puts all the contents in
newfilename
我看到了这个:
i = i+1
if i == splits:
break
并且认为它可能是一个错误的错误,在读取最后一个段之前打破。不,它数为0,1,2而不是1,2,3,所以这应该有用。
我目前的猜测是:
while len(buffer):
buffer = infile.read(bufferSize)
在第一个文件的末尾,它将不会读取任何内容,缓冲区将为空,循环将停止,并且它不会继续执行任何剩余的文件。
这是因为您无法从一个文件重复读入并逐步浏览同一循环中的所有文件。
重新设计为:
outfile = open("new" + filename, "ab")
for i in range(splits):
with open(splitsFilePrefix + str(i), 'rb') as infile:
while len(buffer):
outfile.write(buffer)
print(".", end="")
buffer = infile.read(bufferSize)
所有未经测试的,除了一些快速测试以验证缓冲区的东西,所以ymmv。