dinky-spike559
@dinky-spike559

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

pythonによるテキストファイルの分割の方法

pythonのテキストファイルの分割方法が知りたいです。
何百行にもなるテキストファイルがあります。

1
○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○
2
○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○
3
○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○
4
○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○



500
○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○

のようになっているのですが、これを2行ごとに
1
○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○

で一つのテキストファイル、

2 
○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○

でまた一つのテキストファイル

のように2行ごとにテキストファイルを分割して数字の数だけテキストファイルを分割できる
コードはどのようにしたらよいのでしょうか。
python初心者で実力不足がゆえにとっかかりもありません。
ご教授いただけないでしょうか。

0

2Answer

前回の質問に加えて回答します.

import os

out_dir = './output/'
os.makedirs(out_dir, exist_ok = True)

# 愚直実装
with open("points.txt") as f:
    lines = f.readlines()
    for i in range(len(lines) // 2):
        with open(os.path.join(out_dir, f"{i}.txt"), "w") as output:
            index = lines[i * 2]
            text = lines[i * 2 + 1]
            output.writelines(lines[i * 2: (i + 1) * 2])

# 最初でまとめる方法
with open("points.txt") as f:
    lines = f.readlines()
    lines = [lines[i: i + 2] for i in range(0, len(lines), 2)]
    for i, (index, text) in enumerate(lines):
        with open(os.path.join(out_dir, f"{i}.txt"), "w") as output:
            output.writelines(index + text)

とりあえず2行ずつ抜き出すコードを記述しておきます.

f.readlines()は配列になっているので,配列の操作を調べて実装するべき内容になると思います.参考までに

2Like

Comments

  1. @dinky-spike559

    Questioner

    ご回答ありがとうございます。
    このコードを改良して名前を自分の好きなように変更できるようにしたいのですが、どうすればよいのでしょうか。
    新しく質問を投稿したのでよろしければご回答をいただきたいです。

@PondVillege さんのurlを参考に
作成してみました。但し、zipは少ない行に合わせてるためか?奇数行は未対応です。

def getKigu(file):
    with open(file,"r", encoding="UTF-8") as fd1:
     lines = iter(fd1.readlines())
     for no, (ki,gu) in enumerate(zip(lines,lines)):
             yield str(no), ki,gu

for no, ki, gu in getKigu("points.txt"):
    with open(no + ".txt","w", encoding="UTF-8") as fd2:
      fd2.write(ki)
     fd2.write(gu)
      fd2.flush()

尚、汎用性を考慮してyieldを持ちいて入力処理と出力処理を分離してます。
残念ながら、私はiterとzipで何故、2個ずれるか?完全に理解できていません。
多分、zip内部 zip(lines,lines) でnext(lines)が2回実行されていると思います。

1Like

Your answer might help someone💌