我有一个看起来像这样的文件(必须放入代码框,因此它类似于文件):
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])
答案 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()方法作为参数。这基本上是说“匹配任何字符串,其中第一个零字符是什么都没有。它匹配任何强大的你可以给它。
请参阅其他答案,了解您应该在这里做些什么。