将文件夹中的所有文件数量合并为一个文件

时间:2018-08-17 05:01:38

标签: python shutil os.path

我在一个文件夹中有很多文件(大约200万个文件),我想将每50个文件合并为一个。下面的代码将所有内容合并为一个。我想不出一种方法,将每50个文件合并为一个文件,并确保将50的乘法数中的任何数字也合并为一个文件。例如,如果文件数为2,000,034,那么最终我会得到许多文件,其中包括50个合并文件,而一个文件包含最后34个文件。

from glob import iglob
import shutil
import os

PATH = r'C:\Test'

destination = open('allcontents.sh', 'wb')
for file in iglob(os.path.join(PATH, '*.sh')):
    shutil.copyfileobj(open(file, 'rb'), destination)
destination.close()

3 个答案:

答案 0 :(得分:2)

我将使用列表而不是迭代器,因为列表更易于操作:

filelist = glob(os.path.join(PATH, '*.sh'))

将列表切成50个项目的切片,并将每个切片中的文件复制到一个文件中。输出文件的名称包含切片中第一个文件的编号:

BLOCK = 50
for i in range(0, len(filelist) + BLOCK, BLOCK):
    with open('contents-{}.sh'.format(i), 'wb') as destination:
        for filename in filelist[i:i+BLOCK]:
            with open(filename, 'rb') as infile:
                shutil.copyfileobj(infile, destination)

答案 1 :(得分:1)

您几乎拥有了这个。我尚未测试下面的代码,但是它将为您提供想法:

from glob import iglob
import shutil
import os

PATH = r'C:\Test'

filecounter = 1
fiftycounter = 0
destination = open('fifties1.sh', 'wb')
for file in iglob(os.path.join(PATH, '*.sh')):
    shutil.copyfileobj(open(file, 'rb'), destination)
    fiftycounter += 1
    if 50 == fiftycounter:
        fiftycounter = 0
        destination.close()
        filecounter += 1
        destination = open('fifties' + str(filecounter) + '.sh', 'wb')
destination.close()

答案 2 :(得分:1)

标准库文档中的itertools recipes包含以下配方(逐字引用):

None

您可以使用它来包装i_files = iglob(os.path.join(PATH, '*.sh')) i_grouped = grouper(i_files, 50) for (n, group) in enumerate(i_grouped): destination_fn = 'allcontents_{}.sh'.format(n) with open(destination_fn, 'w') as f: for input_fn in group: ... 调用,以带回50个元素的块(最后一个元素将在末尾有额外的{{1}}),然后遍历该列表。

{{1}}