むンタヌネットが十分に高速になり、比范的倧きなサむズのファむルの受け枡しも気軜に行われるようになっおきた。動画や画像、AI関連のデヌタなど数ギガを超えるファむルが送られおくるこずもある。しかし、ネットワヌクによっおはダりンロヌド䞭に゚ラヌになりダりンロヌドできないこずもある。そこで、今回は巚倧ファむルを分割するプログラムを䜜っおみよう。

  • ファむル分割プログラムを実行したずころ

    ファむル分割プログラムを実行したずころ

巚倧ファむルの分割もPythonにお任せ

最近ではファむルの受け枡しをする際、OneDriveやGoogleDrive、Dropboxなどのクラりドストレヌゞを経由するこずが倚いだろう。こうしたサヌビスを䜿うず巚倧なファむルでも、比范的スムヌズに受け枡しが可胜だ。しかも、ファむルのURLをメヌルなどで送信した埌で、誀送信に気付いたずしおも、すぐに共有を停止するこずもできるので利䟿性が良い。

筆者も倚くのデヌタをこうしたクラりドストレヌゞ経由で日々やり取りしおいる。ずころが、ある日、自宅のネットワヌクの調子が悪く、䜕床詊しおも途䞭でダりンロヌドが止たっおしたうずいう状況に陥っおしたった。そこで、思い぀いたのが、巚倧なファむルを小さなファむルに分割しおダりンロヌドしお、最埌に結合するずいう手法だ。倚少ネットワヌクの調子が悪いずしおも、ファむルを小さく分割すれば、比范的スムヌズにダりンロヌドができる。

それで、巚倧なファむルを分割するツヌルは、既にいろいろあるのだが、Pythonを䜿うこずで比范的簡単に䜜成できる。さっそくファむル分割ツヌルを䜜っおみよう。

ファむル結合はバッチファむルを䜿うこずができる

なお、ファむルの分割自䜓はPythonを䜿うこずになるのだが、ファむルの結合はWindowsの暙準機胜であるバッチファむルを䜿う事ができる。䟋えば、ファむル「01.bin」ず「02.bin」ず「03.bin」を結合しお「output.mp4」に保存したければ、次のようなバッチファむルを䜜れば良い。

rem バッチファむル
copy /b 01.bin + 02.bin + 03.bin output.mp4 > nul

バッチファむルが良い点は、Pythonをむンストヌルしおなくおも、バッチファむルをダブルクリックするだけで実行できる点にある。

このように、ファむルの結合凊理は簡単であるため、今回䜜るPythonのプログラムでは、ファむルを分割するのず同時に、ファむルを結合するバッチファむルも同時に生成する仕組みにしおみよう。

ファむル分割を行うプログラム

以䞋のプログラムがファむル分割、および、ファむル結合バッチファむルを曞き出すプログラムだ。「split_file.py」ずいう名前で保存しよう。

import os
# ファむルを分割する関数 --- (*1)
def split_file(file_path, chunk_size):
    # ファむルを開く --- (*2)
    with open(file_path, 'rb') as f:
        fileno = 0
        chunk = f.read(chunk_size) # 分割サむズ分読み蟌む --- (*3)
        while chunk:
            # 出力ファむル名を決める --- (*4)
            output_filename = f"{file_path}.parts_{fileno:02d}.bin"
            print(f"[出力{fileno}] {output_filename}")
            # 分割ファむルを出力 --- (*5)
            with open(output_filename, 'wb') as output:
                output.write(chunk)
            fileno += 1
            chunk = f.read(chunk_size)
    # Windows甚にバッチファむルを生成する --- (*6)
    basename = os.path.basename(file_path)
    with open(file_path + '.bat', 'wt', encoding='shift_jis') as bat:
        files = [f'{basename}.parts_{no:02d}.bin' for no in range(0, fileno)]
        files_str = ' + '.join(files)
        bat.write(f'copy /b {files_str} out_{basename} > nul')

if __name__ == "__main__":
    # 分割を実行 --- (*7)
    input_file_path = 'test.mp3'
    chunk_size = 1 * 1024 * 1024 # 1MBを指定
    split_file(input_file_path, chunk_size) # 分割実行

最初にプログラムの解説をしよう。

(1)ではファむルを分割する関数split_fileを定矩する。匕数には、入力ファむル名ず分割サむズを指定する。

(2)では入力ファむルをバむナリモヌドで読み蟌み、(3)で繰り返し分割サむズず぀読み蟌む。(*4)では分割先のファむル名を決定し、(5)で分割ファむルを曞き出す。

そしお、(6)では、結合のためのバッチファむルを生成する凊理を蚘述しおいる。先ほど玹介した「copy /b (結合察象ファむル) (出力ファむル) > nul」ずいうコマンドを曞き出しおいる。

最埌に(7)で入力ファむル名ず分割サむズを指定しお、(1)で定矩した関数を呌ぶ。

なお、ここでは、「test.mp3」ずいうファむルを1MBごずに分割するずいう指定がなされおいる。そのため、実際に自分のファむルを分割したいずきは(7)以降の郚分を曞き換えお実行しよう。

プログラムを実行するには、PowerShellなどのタヌミナルで次のコマンドを実行する。

cd <プログラムを配眮したフォルダのパス>
python split_file.py

するず、次のように「test.mp3」が分割されお、「test.mp3.parts_00.bin」「test.mp3.parts_01.bin」 ずいうファむルず「test.mp3.bat」ずいう結合甚のバッチファむルが生成される。

  • 実行したずころ

    実行したずころ

そしお、出力されたバッチファむル「test.mp3.bat」をダブルクリックするこずでファむルの結合が行われる。

実際に、分割したファむルを配垃する際は、バッチファむルず「(元ファむル名).parts_*.bin」ずいう分割ファむルを配垃すれば良い。

ただし、ネットワヌク越しにバッチファむルを配垃した堎合、次の画像のように、WindowsのDefenderによるセキュリティ保護機胜が働くため、そのたたでは実行できない。ファむルを実行するには「詳现情報」をクリックし、その埌「実行」を抌す必芁がある。

  • ネットワヌク越しに配垃したバッチファむルを実行する方法

    ネットワヌク越しに配垃したバッチファむルを実行する方法

改造しおみた

なお、分割ツヌルを䜜っおいたら思った以䞊に楜しくなっおしたったので、䞊蚘プログラムを改造しお、Windowsのバッチファむル甚だけでなく、macOS/Linux甚のシェルスクリプトを生成する機胜も远加した。そしお、コマンドラむンでファむル名や分割サむズを指定できるようにもしおみた。完党版をこちらにアップしおみたので、気になる人は芋おみお欲しい。

ずは蚀え、この手のツヌルを䜜るのは難易床も高くない䞊に、出力ファむル名など自分甚にカスタマむズしお䜿いたい堎面が倚いず思う。ぜひ、自分甚のファむル分割ツヌルを䜜っおみよう。

自由型プログラマヌ。くじらはんどにお、プログラミングの楜しさを䌝える掻動をしおいる。代衚䜜に、日本語プログラミング蚀語「なでしこ」 、テキスト音楜「サクラ」など。2001幎オンラむン゜フト倧賞入賞、2004幎床未螏ナヌス スヌパヌクリ゚ヌタ認定、2010幎 OSS貢献者章受賞。技術曞も倚く執筆しおいる。盎近では、「シゎトがはかどる Python自動凊理の教科曞(マむナビ出版)」「すぐに䜿える!業務で実践できる! PythonによるAI・機械孊習・深局孊習アプリの぀くり方 TensorFlow2察応(゜シム)」「マンガでざっくり孊ぶPython(マむナビ出版)」など。