Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中只向文件写入某些行?_Python_File - Fatal编程技术网

如何在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])
             )