如何在Python中只向文件写入某些行?
我有一个像这样的文件(必须放在代码框中,使其类似于文件): 我只想从文件中抓取“文本”行(或每四行),然后将它们复制到另一个文件中。这是我的代码,但它会将所有内容复制到新文件中:如何在Python中只向文件写入某些行?,python,file,Python,File,我有一个像这样的文件(必须放在代码框中,使其类似于文件): 我只想从文件中抓取“文本”行(或每四行),然后将它们复制到另一个文件中。这是我的代码,但它会将所有内容复制到新文件中: import sys def process_file(filename): output_file = open("data.txt", 'w') input_file = open(filename, "r") for line in input_file: line
import sys
def process_file(filename):
output_file = open("data.txt", 'w')
input_file = open(filename, "r")
for line in input_file:
line = line.strip()
if not line.startswith("(") or line.startswith(""):
output_file.write(line)
output_file.close()
if __name__ == "__main__":
process_file(sys.argv[1])
脚本之所以要复制每一行,是因为无论
line
的值等于多少,line.startswith(“”
都是真的
您可以尝试使用isspace
测试line
是否以空格开头:
def process_file(filename):
with open("data.txt", 'w') as output_file:
with open(filename, "r") as input_file:
for line in input_file:
line=line.rstrip()
if not line.startswith("(") or line[:1].isspace():
output_file.write(line)
除了总是为true的
line.startswith(“”
之外,line.strip()
将删除前导选项卡,强制写入选项卡式数据。将其更改为line.rstrip()
,并使用\t
测试选项卡。这部分代码应该如下所示:
line = line.rstrip()
if not line.startswith(('(', '\t')):
#....
针对您在评论中提出的问题:
#edited in response to comments in post
for i, line in input_file:
if i % 4 == 0:
output_file.write(line)
尝试:
不执行line.strip()(这将剥离选项卡)因此问题在于:(1)您误用了布尔逻辑,(2)每一行都以“”开头
首先,布尔逻辑:
or运算符的工作方式是,如果其任一操作数为True,则返回True。操作数为“not line.startswith(”(“)”和“line.startswith(”)”。请注意,不仅适用于其中一个操作数。如果要将其应用于or表达式的总结果,必须将整个结果放在括号中
第二个问题是使用长度为零的strong作为参数的startswith()方法。这本质上是说“匹配前零个字符为零的任何字符串。它匹配您可以给它的任何strong
请参阅其他答案,了解您应该在这里做什么
with open('data.txt','w') as of:
of.write(''.join(textline
for textline in open(filename)
if textline[0] not in ' \t(')
)
要每四行写入一次,请使用切片结果[::4]
with open('data.txt','w') as of:
of.write(''.join([textline
for textline in open(filename)
if textline[0] not in ' \t('][::4])
)
我不需要在write中使用换行符。我认为您需要
line=line.rstrip()
和如果不是line.startswith(“(”,“\t”):
他仍然需要使用line.rstrip()
若要删除尾随的换行符,您使用的是布尔逻辑,但在第二个问题上,您已经偏离了方向。再看看这个问题。您是对的。不知怎的,我已经意识到OP处理的是空行。看起来他找到了一个适合他的答案,但我将删除关于空行的部分。谢谢。这些文件不需要关闭,因为它们不是正常打开的,而是用作生成器。垃圾收集器在退出函数或程序时处理“w”的情况。无论如何,我将其更正为与一起使用,这样在出现错误时也会处理关闭输出文件的问题。挑剔:这些文件完全正常打开。它们由上下文管理员关闭ager(带有语句的),当代码块退出时,它调用文件对象上的\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu>方法。然后对文件对象进行垃圾收集。您可以将for部分更改为“。这样,您就不必担心初始化和单独更新i。感谢您的帮助。我只需添加我必须添加的输出文件。write('\n')以使其在新行中每四行写入一行。此外,您可能需要编辑writeline(行)第二段代码的一部分,以防其他人有此问题,但没有抓住它。:)
with open('data.txt','w') as of:
of.write(''.join(textline
for textline in open(filename)
if textline[0] not in ' \t(')
)
with open('data.txt','w') as of:
of.write(''.join([textline
for textline in open(filename)
if textline[0] not in ' \t('][::4])
)