找到匹配时仅从前 3 行中删除 '\n'
Strip '\n' only from previous 3 lines when match found
如果一行以逗号开头,我想删除前 3 行的换行符。我从 txt 文件中读取了我的台词。
我能够找到我想从中删除 \n 的行,但不幸的是我的代码删除了所有新行......我很乐意提供一些帮助我的代码有什么问题。
with open(in_file9, 'r', encoding='utf-8') as fin, open(out_file10, 'w', encoding='utf-8') as fout:
lines = fin.read().splitlines()
count = 0
for i, line in enumerate(lines):
count = count + 1
if line.startswith(','):
print (lines[i - 1])
lines[i - 1].strip('\n')
lines[i - 2].strip('\n')
lines[i - 3].strip('\n')
fout.write(line)
编辑:
这是一个带图片的例子,因为这里写的时候看起来不对,但是图片显示了。
*在*
6.30.230。
STLB-Bau:11/2017 068
一些文字,对称,DIN FFF 1234 (VDE
1.850
,000 米
6.30.220。
STLB-Bau:10/2015 123
一些其他文本,对称性,DIN FFF 6789 (VDE 950,000 m
Out(我有什么)
6.30.230。 STLB-Bau:11/2017 068 一些文字,对称,DIN FFF 1234 (VDE 1.850 ,000 m 6.30.220。STLB-Bau:10/2015 123 一些其他文字,对称,DIN FFF 6789 (VDE 950,000 m
出(我想要的):
6.30.230。
STLB-Bau:11/2017 068
一些文字,对称,DIN FFF 1234 (VDE 1.850,000 m
6.30.220。
STLB-Bau:10/2015 123
一些其他文本,对称性,DIN FFF 6789 (VDE 950,000 m
换行符实际上被 splitlines()
删除,因为您没有提供 keepends
参数。但是,除了 fin.read().splitlines(keepends=True)
,您还可以 fin.readlines()
.
问题的下一部分是您在检查逗号时将行写入文件,所以当您看到要查找的逗号时,已经来不及更改了前几行。相反,首先修改所有行,然后将所有内容写入文件。
最后,我会注意到 lines[i - 1].strip('\n')
实际上并没有修改 lines[i - 1]
。它只是 returns 行的修改版本,但您仍然需要将其分配回来。
解决您代码中的这些问题,这似乎可以满足您的要求:
with open(in_file9, 'r', encoding='utf-8') as fin, open(out_file10, 'w', encoding='utf-8') as fout:
lines = fin.readlines()
for i, line in enumerate(lines):
if line.startswith(','):
lines[i - 1] = lines[i - 1].strip('\n')
lines[i - 2] = lines[i - 2].strip('\n')
lines[i - 3] = lines[i - 3].strip('\n')
fout.write(''.join(lines))
综上所述,如果您的问题可以概括为 "if a line starts with a comma, connect it to the last non-blank line",这里有一个使用正则表达式的更短、更灵活的解决方案:
from re import sub, MULTILINE
with open(in_file9, 'r', encoding='utf-8') as fin, open(out_file10, 'w', encoding='utf-8') as fout:
lines = fin.read()
lines = sub(r'\s+^(?=,)', '', lines, flags=MULTILINE)
fout.write(lines)
如果一行以逗号开头,我想删除前 3 行的换行符。我从 txt 文件中读取了我的台词。 我能够找到我想从中删除 \n 的行,但不幸的是我的代码删除了所有新行......我很乐意提供一些帮助我的代码有什么问题。
with open(in_file9, 'r', encoding='utf-8') as fin, open(out_file10, 'w', encoding='utf-8') as fout:
lines = fin.read().splitlines()
count = 0
for i, line in enumerate(lines):
count = count + 1
if line.startswith(','):
print (lines[i - 1])
lines[i - 1].strip('\n')
lines[i - 2].strip('\n')
lines[i - 3].strip('\n')
fout.write(line)
编辑: 这是一个带图片的例子,因为这里写的时候看起来不对,但是图片显示了。
*在*
6.30.230。 STLB-Bau:11/2017 068 一些文字,对称,DIN FFF 1234 (VDE
1.850 ,000 米
6.30.220。 STLB-Bau:10/2015 123 一些其他文本,对称性,DIN FFF 6789 (VDE 950,000 m
Out(我有什么)
6.30.230。 STLB-Bau:11/2017 068 一些文字,对称,DIN FFF 1234 (VDE 1.850 ,000 m 6.30.220。STLB-Bau:10/2015 123 一些其他文字,对称,DIN FFF 6789 (VDE 950,000 m
出(我想要的):
6.30.230。 STLB-Bau:11/2017 068 一些文字,对称,DIN FFF 1234 (VDE 1.850,000 m
6.30.220。 STLB-Bau:10/2015 123 一些其他文本,对称性,DIN FFF 6789 (VDE 950,000 m
换行符实际上被 splitlines()
删除,因为您没有提供 keepends
参数。但是,除了 fin.read().splitlines(keepends=True)
,您还可以 fin.readlines()
.
问题的下一部分是您在检查逗号时将行写入文件,所以当您看到要查找的逗号时,已经来不及更改了前几行。相反,首先修改所有行,然后将所有内容写入文件。
最后,我会注意到 lines[i - 1].strip('\n')
实际上并没有修改 lines[i - 1]
。它只是 returns 行的修改版本,但您仍然需要将其分配回来。
解决您代码中的这些问题,这似乎可以满足您的要求:
with open(in_file9, 'r', encoding='utf-8') as fin, open(out_file10, 'w', encoding='utf-8') as fout:
lines = fin.readlines()
for i, line in enumerate(lines):
if line.startswith(','):
lines[i - 1] = lines[i - 1].strip('\n')
lines[i - 2] = lines[i - 2].strip('\n')
lines[i - 3] = lines[i - 3].strip('\n')
fout.write(''.join(lines))
综上所述,如果您的问题可以概括为 "if a line starts with a comma, connect it to the last non-blank line",这里有一个使用正则表达式的更短、更灵活的解决方案:
from re import sub, MULTILINE
with open(in_file9, 'r', encoding='utf-8') as fin, open(out_file10, 'w', encoding='utf-8') as fout:
lines = fin.read()
lines = sub(r'\s+^(?=,)', '', lines, flags=MULTILINE)
fout.write(lines)