dinky-spike559
@dinky-spike559

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

テキストファイルを分割し、自分の好きなように名前をつける。

解決したいこと

何百行もあるテキストファイルから2行ずつ抜き出して、それぞれテキストファイルに分割するというコードはどう書くのかと質問し、教えていただきました。
それが以下のコードです。

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)

ここから、「生成されるテキストファイルの名前を自分の作ったリストから作る」ということをしようとしました。

import os

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

#配列の例(実際は生成されるテキストファイルの数だけ要素はある)
with open("名前.txt") as t:
    a = t.read().splitlines()

#for j in a: を追加し、f"{i}.txtをf"{j}.txtに変更した
for j in a:
    with open("points.txt") as f:
        lines = f.readlines()
        for i in range(len(lines) // 2):
            with open(os.path.join(out_dir, f"{j}.txt"), "w") as output:
                index = lines[i * 2]
                text = lines[i * 2 + 1]
                output.writelines(lines[i * 2: (i + 1) * 2])

のようにjをもってきてwith open(os.path.join(out_dir, f"{j}.txt"), "w") as output:のi→jに変えればできると思ったのですが、たしかに名前は自分の用意したリストどうりの名前に変わりましたが、肝心の中身がすべて同じ内容になってしまいました。

どうすれば中身を変えずに名前を自分の用意したリストに変更すればよいのでしょうか。
ご教授お願いします。

0

2Answer

以下のようなイメージでしょうか?

名前のテキスト

name.txt
test1
test2
test3

分割元のテキスト

points.txt
1
test1
2
test2
3
test3

分割後テキスト一覧

test1.txt
1
test1
test2.txt
2
test2
test3.txt
3
test3
import os

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

# 名前の読み込み
with open("name.txt") as t:
    name_list = t.read().splitlines()

# 分割元テキストの読み込み
with open("points.txt") as f:
    lines = f.readlines()
    
# 2行ごとに分割
split_lines = ["".join(lines[i: i + 2]) for i in range(0, len(lines), 2)] 

for textfile_name, text in zip(name_list, split_lines):
    with open(os.path.join(out_dir, f"{textfile_name}.txt"), "w") as output:
        output.write(text)
0Like

i番目である必要も特になくなったので,次のように実装ができます.

import os

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

with open("name.txt") as f:
    names = f.read().splitlines()

with open("points.txt") as f:
    lines = f.readlines()
    lines = [lines[i: i + 2] for i in range(0, len(lines), 2)]
    for name, (index, text) in zip(names, lines):
        with open(os.path.join(out_dir, f"{name}.txt"), "w") as output:
            output.writelines(index + text)

zip()を使うことで並列に取り出すことができ,各ファイルに用意した名前を与えることができます.

0Like

Your answer might help someone💌