【问题标题】:Split text files at 5000 characters limit以 5000 个字符的限制拆分文本文件
【发布时间】:2020-12-19 17:25:13
【问题描述】:

我是 Python 新手,想拆分大量超过 5000 个字符的文本文件。虽然我运行以下代码并创建了输出文件,但存在一个错误:

超过 5000 个字符的文件被拆分,但在目标目录中被跳过;如果要拆分文件 026.txt,则跳过 output_26.txt 文件,但将剩余的字符(从 5001 开始)复制到 output_27.txt 中,没问题。看一下截图:

Directory of split files missing output_26.txt

看一下代码:

import os
import codecs

directory = 'path/to/directory'
n = 5000
split_strings = []
file_counter = 1
split_files = []

for filename in os.listdir(directory):
    with codecs.open(os.path.join(directory, filename), 'r', encoding='utf-8') as f:
        text = f.read()
        for index in range(0, len(text), n):
            split_strings.append(text[index: index + n])
        f.close()

    for i in split_strings:
        file_counter = split_strings.index(i)

    with codecs.open("output_" + str(file_counter) + '.txt', 'w', encoding='utf-8') as o:
        o.write(i)
        o.close()
        file_counter += 1

    if len(text) >= n:
        split_files.append(filename)

print(split_files)
print("Total split files: {}".format(len(split_files)))

代码中缺少什么?

【问题讨论】:

  • for i in split_strings 循环的目的是什么?它分配了file_counter,但在下一个循环中它会立即重新分配,替换之前的值。当循环结束时,file_counter 将只是分配的最终值。这是故意的吗?
  • @JohnGordon 这是一个非常好的观点!这不是故意的。后来添加了for i in split_strings 循环,但我忘记删除重新分配file counter 的行。感谢您指出它,虽然它不能解决问题。
  • 使用调试器单步调试代码,这样您就可以准确找出代码错误的地方。
  • 如果您可以进一步减少此代码和输入数据,其他人可能更容易帮助您。例如,您可以设置 n = 10 并运行一个包含 25 个字符的文件并显示每个文件的内容吗?其他建议:stackoverflow.com/help/minimal-reproducible-example
  • @MatthewCox 我就是这么做的;我找到了a snippet for splitting strings 并尝试在我的代码中实现它。我只在前 30 个文件中运行它,因为我知道文件 027.txt 和 030.txt 需要拆分。感谢您的评论!

标签: python split


【解决方案1】:

在调试完每一行代码后,我发现了它的问题所在:用于写入新文件的 with 块应该嵌套在它之前的 for 循环中。

代码如下:

import os
import codecs

directory = 'path/to/directory'
n = 5000
split_strings = []
file_counter = 1
split_files = []

for filename in os.listdir(directory):
    with codecs.open(os.path.join(directory, filename), 'r', encoding='utf-8') as f:
        text = f.read()
        for index in range(0, len(text), n):
            split_strings.append(text[index: index + n])
        f.close()

for i in split_strings:
    file_counter = split_strings.index(i)
    with codecs.open("output_" + str(file_counter) + '.txt', 'w', encoding='utf-8') as o:
        o.write(i)
        o.close()
        file_counter += 1

if len(text) >= n:
    split_files.append(filename)

print(split_files)
print("Total split files: {}".format(len(split_files)))

感谢大家抽出宝贵时间发布 cmets!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-23
    • 1970-01-01
    • 2018-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-03
    相关资源
    最近更新 更多