您好我遇到了这个小问题,我正在从一个文件中读取一些内容,提取一些列并将其写入另一个文件。现在,因为write()方法不会在每行文本之后添加换行符,所以我通过下面的代码执行了这一操作,但是这会产生一个问题,即它会在文件的末尾添加一个额外的空白行,这是不可取的。 / p>
fh.write(string+'\n')
所以我想知道我们如何解决这个问题,下面是我的代码
with open("C:\\test.txt") as fh, open("C:\\newtest","w") as f:
for line in fh:
if not re.search("^$",line):
f.write(line.split()[-1].split(",")[0]+'\n')
所以有任何建议。
答案 0 :(得分:1)
如果你知道你的文件总是至少有一行,你可以简单地写第一行而不做任何更改,然后写下所有后续行,\r\n
附加到字符串的开头:
with open("C:\\test.txt") as fh, open("C:\\newtest","w") as f:
for line in fh:
if not re.search("^$",line):
f.write(line.split()[-1].split(",")[0]) #first line with no newline
break #on first occurance
for line in fh:
if not re.search("^$",line):
f.write('\n'+line.split()[-1].split(",")[0]) #rest of the lines with prepended newline
为什么文件不会在第二行的第一行开始?
在幕后,对象fh
有一些内部状态来有效地跟踪一个"光标"在文件中,以及一个名为fh.next()
的特殊方法,此方法用于生成下一个值(在这种情况下,每行由'\n'
分隔。当文件末尾达到特殊类型时异常被引发,称为StopIteration
这是一个特殊的异常类型,被for循环识别,告诉它退出循环。如果使用break
事先退出循环,文件中的内部游标将保持不变,进一步的迭代从你离开的地方开始。
您可以通过创建自己的自定义生成器并使用for循环遍历它来了解迭代在幕后的工作原理:
def generator_constructor():
x = 10
while x > 0:
yield x
x = x - 1 #decrement x
generator = generator_constructor()
print generator.next() #prints 10
print generator.next() #prints 9
print "\nlooping\n" #indicate where we enter the loop
while True: #infinite loop we will need to break out of somehow
try:
print generator.next() #print next value
except StopIteration: #if we reach the end (exit wile loop of generator constructor)
break #then break out of the loop
尝试使用此代码并使其更有趣,以便您了解幕后发生的事情
答案 1 :(得分:0)
with open("C:\\test.txt") as fh, open("C:\\newtest","w") as f:
output_lines = []
for line in fh:
if not re.search("^$",line):
output_lines.append(line.split()[-1].split(",")[0])
output = '\n'.join(output_lines)
f.write(output)
甚至
with open("C:\\test.txt") as fh, open("C:\\newtest","w") as f:
output_lines = [
line.split()[-1].split(",")[0]
for line in fh
if not re.search("^$",line)
]
output = '\n'.join(output_lines)
f.write(output)
答案 2 :(得分:0)
我只是解决了它,这是一个误解我想编辑器,因为我检查了空白行,我没有找到任何。
with open("C:\\test.txt") as fh, open("C:\\newtest","w") as f:
for line in fh:
if not re.search("^$",line):
f.write(line.split()[-1].split(",")[0]+'\n')
fh=open("C:\\ECD Utilization Script - Copy\\newtest","r")
n=0
for line in fh:
if re.search("^$",line):
n=n+1
print(n,"Blank lines")
fh.close()