テキストファイルがでかすぎて開けない時pythonの簡単な分割コードを紹介します。
目次
テキストファイルが開けない事件
開発中では以下のようなログファイルというのを吐き出すようにしています。
アプリ開発でしたら、「どんな操作した」「どんな通信をした」「どんなエラーがでた」などが記載されていきます。
このファイルを開いて中身を確認するのですが、だいたい1GBを超えたあたりから、VScodeでも開けず、メモ帳でも開けなくなってしまいます。
こうなったらファイルを分割するしかありません。
テキストファイルの分割方法
ネットで調べた結果、テキストファイルの分割には以下の方法があるみたいです。
- フリーソフトを使う
- windowsPowerShellでコマンドを入力する
フリーソフトですが、結構古いものが多いです。Windows10がサポート対象かチェックする必要があります。
WindowsPowerShellでは1行で処理ができますが、正直ちょっと難しいです。
結果、よくわかんないし、pythonでやっちゃえばいいじゃん的な感じで書いてみました。
pythonでテキストファイルを分割
前提として、テキストファイル(画像や動画、バイナリデータではないファイル。.txtなど)を行数に対して2分割や3分割にするコードになります。
python3.8を使っており、標準モジュールで完結します。(モジュールの追加なし)
pythonが入ってない人は、pythonの最新バージョンをインストールしてから初めてください。ネットでpythonホームページに行って、インストールするだけです。(マックブックには標準で入ってます)
➀メモ帳にコードを保存する
メモ帳を開き、
import sys
count = 0
idx = 0
in_file = sys.argv[1]
num_file = int(sys.argv[2])
out_files = []
# 分割ファイルをリストに入れる
for i in range(num_file):
out_files.append('{0}_{1}'.format(i+1, in_file))
# ファイルの行数をカウントし、countに入れる
with open(in_file, 'r', encoding='utf-8') as f:
for line in f:
count += 1
line_count = count / num_file
n = 0
# ファイルの総行数を表示する
print('line_count : {0}'.format(count))
#分割実行部分
with open(in_file, 'r', encoding='utf-8') as i:
for out_file in out_files:
f = open(out_file, 'w', encoding='utf-8')
while True:
line_i = i.readline()
if idx <= line_count:
f.writelines(line_i)
print('now file : {0}, current line : {1} / {2}'.format(out_file, int(idx + n * line_count), count))
else:
idx = 0
break
idx += 1
n += 1
f.close()
上記コードを張り付けて、separate.pyなどと名前を付けて保存します。
②フォルダに移動する
分割したいファイルとseparate.pyを同じディレクトリ(フォルダ)に移動します。(移動させなくてもよいが、相対パス・絶対パスを書く必要がなくなる)
コマンドプロンプトを起動します。windowsなら絶対入っているので、スタートメニューから探してください。マックブックはターミナルってやつですかね。
③ファイルのあるフォルダに移動する
cd "ファイルのあるフォルダのパス"
上記をコマンドプロンプト上で実行します。cdコマンドで移動したいフォルダに移動できます。以下が例になります。(マックブックの人はマックブックのコマンドに置き換えてください)
⑤separate.pyを実行する
python separate.py "分割したいファイル" "分割したい数"
上記をコマンドプロンプト上で実行します。以下が例になります。例ではsample.txtを2分割しています。
ここで注意してほしいのが、分割する境界の基準が行数になっているので、ファイルのサイズが均等に分割されるわけではありません。
⑥処理が完了するまで待つ
separate.pyを実行したら以下の表示がされるはずです。
line_countはファイルの総行数です。now_fileは分割先のファイル名(<数字>_<もともとのファイル名>となっています)です。current lineは実行中の行数です。
処理が終わると、以下のように番号が付けられたファイルが作成されているはずです。番号は昇順でつけられています。お好みでファイル名を変えてください。
ちなみに、ソースコードの12行目でファイル名のフォーマットは変えられます。
以上で分割完了です!おつかれさまでした。
もしうまくいかなかったら
以下の問題がないか確認してみてください
- pythonがインストールされていない
- コマンドのスペルミス(空白が多い, ファイル名ミス, 引数の数があっていない)
- フォルダに分割対象ファイルとseparate.pyが一緒に入っていない
- フォルダに移動できていない