如何在Python中只将某些行写入文件?

时间:2010-08-07 19:03:49

标签: python file

我有一个看起来像这样的文件(必须放入代码框,因此它类似于文件):

text
(starts with parentheses)
         tabbed info
text
(starts with parentheses)
         tabbed info

...repeat

我想从文件(或每四行)中仅抓取“文本”行,并将它们复制到另一个文件中。这是我的代码,但它将所有内容复制到新文件中:

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])

5 个答案:

答案 0 :(得分:1)

您的脚本复制每一行的原因是因为line.startswith("")为True,无论line等于什么。

您可以尝试使用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) 

答案 1 :(得分:1)

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一起使用。

答案 2 :(得分:0)

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)

答案 3 :(得分:0)

尝试:

if not line.startswith("(") and not line.startswith("\t"):

不执行line.strip()(这将剥离选项卡)

答案 4 :(得分:0)

所以问题是(1)你滥用布尔逻辑,(2)每条可能的行以“”开头。

首先,布尔逻辑:

or运算符的工作方式是,如果其操作数之一为True,则返回True。操作数是“not line.startswith('(')”和“line.startswith('')”。请注意,这不仅适用于其中一个操作数。如果要将其应用于或的总结果表达式,你必须将整个事物放在括号中。

第二个问题是你使用带有零长度强的startswith()方法作为参数。这基本上是说“匹配任何字符串,其中第一个零字符是什么都没有。它匹配任何强大的你可以给它。

请参阅其他答案,了解您应该在这里做些什么。