在固定宽度的文本文件中的多个位置添加分隔符的问题
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)
试着 运行 在脑海中思考你在这里做什么:
- 对于位置中的每个位置
- 设置
newline
为原行,分隔符在该位置
- 按原样将
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
我正在尝试在固定宽度的文本文件中的多个位置添加定界符,如下表所示。我正在使用 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)
试着 运行 在脑海中思考你在这里做什么:
- 对于位置中的每个位置
- 设置
newline
为原行,分隔符在该位置 - 按原样将
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