在固定宽度的文本文件中的多个位置添加分隔符的问题

Issue with adding a delimiter at multiple positions in a fixed width text file

我正在尝试在固定宽度的文本文件中的多个位置添加定界符,如下表所示。我正在使用 python 3.4.4

文件:

a.txt

@4a54667inthenationof pr
@3453343bewithmeincaseof
list=[4,8, 11]

因为,文件中有 1000 行,所以我试图通过遍历列表并将其添加到 newline 变量中来实现这一点,但分隔符没有添加到适当的位置。

代码:

with open('output.txt', 'w') as outfile:
    with open('a.txt', 'r') as infile:
        for line in infile:
            for l in list:
                newline = line[:l] + '|' + line[l:]
                outfile.write(newline)
outfile.close() 

当前输出:生成错误

output.txt

@4a5|4667inthenationof pr
@4a54667|inthenationof pr
@4a54667int|henationof pr
@345|3343bewithmeincaseof@3453343|bewithmeincaseof@3453343bew|ithmeincaseof

预期输出:定界符在固定位置 4、8 和 11

@4a5|466|7i|nthenationof pr
@345|334|3b|ewithmeincaseof

问题是您在迭代 list 中的项目时正在写入输出文件。下面的代码应该可以解决这个问题。另外,尽量避免使用关键字作为变量名,因此将 list 重命名为其他名称。

代码

positions = [4, 8, 11]

with open('output.txt', 'w') as outfile:
    with open('a.txt', 'r') as infile:
        for line in infile:
            newline = line
            for l in positions:
                newline = newline[:l] + '|' + newline[l:]
            outfile.write(newline)

输出

@4a5|466|7i|nthenationof pr
@345|334|3b|ewithmeincaseof

首先,我建议不要使用内置函数作为变量名,因此我建议将 list 重命名为 positions 之类的名称。下一篇:

for l in positions:
    newline = line[:l] + '|' + line[l:]
    outfile.write(newline)

试着 运行 在脑海中思考你在这里做什么:

  • 对于位置中的每个位置
    1. 设置newline为原行,分隔符在该位置
    2. 按原样将 newline 写入文件,使用单个分隔符。

所以基本上,对于每个位置,您都在复制该位置的行。可能,这更接近你的意思(不使用任何 Python 恶作剧):

newline = line
pos_counter = 0
for pos in positions:
    pos += pos_counter
    newline = newline[:pos] + '|' + newline[pos:]
    pos_counter += 1
outfile.write(newline)

请注意,由于 newline 越来越大,我必须不断增加 pos 才能考虑到这一点。另请注意,当我完成修改该行时,我正在写信。为避免簿记,您可以倒退:

for pos in positions[::-1]:
    newline = newline[:pos] + '|' + newline[pos:]

现在 newline 在当前插入位置之后变长了。最后恶作剧:

newline = '|'.join(line[start:stop] for start, stop in zip([0]+positions, positions+[-1]))

我认为输出文件中的输出 4 是由于 for loop 造成的,为了摆脱它,您应该将 outfile.write() 放在第一个 for loop .因为你想要管道符号'|'在 4,8 和 11 的位置,你可以将它插入行列表并加入写入新的输出文件

lit=[4,8, 11]
with open('output.txt', 'w') as outfile:
    with open('a.txt', 'r') as infile:
        for line in infile:
            line = list(line)
            for i in lit:
                line.insert(i,'|')
            outfile.write("".join(line))
outfile.close() 

这是使用 .insert

的另一种方法

例如:

lst=[4,8, 11]
with open(filename_1) as infile, open(filename_2, 'w') as outfile:
    for line in infile:
        line = list(line)
        for p in lst:
            line.insert(p, "|")       #insert `|` @ given pos
        outfile.write("".join(line))  #join & write

输出:

@4a5|466|7i|nthenationof pr
@345|334|3b|ewithmeincaseof