如何在文本文件(python)中以递归方式以特定间隔添加空格?

时间:2017-11-06 04:56:33

标签: excel python-3.x recursion

我正在学习python 3,我喜欢把自己想象成一个初学者。

我尽可能简单地说明这个问题,我正试图在.txt文件中添加空格。这听起来很容易,但它让我很难过。

所以我有这个巨大的双星文本文件,它们的坐标称为华盛顿双星目录。下载产生一个包含30084行文本的文本文件。我知道我将始终需要在每一行中放置10个字符的空格,然后在接下来的2-4行之后有条件地删除一个空格。

例如

label.text

插入的空间位于" 8"和" S。"在这种情况下,我还需要删除" T"之间的空格。和#34; 125。"

一旦我知道如何递归编辑每一行,我就可以处理空白条件格式。我理解它将与函数和循环有关。我也得到了python来读取文件。

我尝试这样做的主要原因是将其导出为ex​​cel,因为WDS标识符和发现者代码之间缺少空格会导致导入。

非常感谢任何建议。

感谢。

1 个答案:

答案 0 :(得分:0)

虽然可以在您指定的位置插入空格,但我认为这是一个糟糕的策略。例如,空字段由空格表示,因此当它们不为空时它们会很好地读取,但是当它们为空时它们将与相邻的字段合并。除了你提到的内容之外,还有其他字段可以包含内部空间。

我认为更好的方法是:根据WDS Bible format codes将线分成单独的字符串;从一开始就剥离白色空间和这些字符串;用下划线(_)替换内部空格;将数据退回选项卡分隔。

以下是我对此的实现。我的' Xn'代码表示WDS格式的空白区域:

import re
import sys

FORMAT_CODES = [ \
    'A10', 'A7', 'A5', 'X1', 'I4', 'X1', 'I4', 'X1', 'I4', \
    'X1', 'I3', 'X1', 'I3', 'X1', 'F5.1', 'X1', 'F5.1', \
    'X1', 'F5.2', 'X1', 'F5.2', 'X1', 'A9', 'X1', 'I4', \
    'I4', 'X1', 'I4', 'I4', 'X1', 'A8', 'X1', 'A4', 'X1', 'A18', \
]

def format_length(fmt):
    match_object = re.match(r'[A-Z](\d+)', fmt)

    assert match_object is not None

    return int(match_object.group(1))

format_lengths = [format_length(code) for code in FORMAT_CODES]  # optimization

with open(sys.argv[1]) as catalog:
    for line in catalog:
        start = 0
        data = []

        for index, code in enumerate(FORMAT_CODES):
            stop = start + format_lengths[index]

            if not code.startswith('X'):
                string = line[start:stop]
                data.append(string.strip().replace(' ', '_'))

            start = stop

        print(*data, sep='\t')

在我的系统上,此代码能够在手动剥离非数据标题行后约2秒内处理30K行00-06小时部分。