我有一个需要解析的文本文件。 在此文本文件中,单词,数字,空格等在此文件中没有特定的顺序。
此.txt文件中的某些内容将出现在字符串中:
state0
当我看到这个时,我需要将整行解析成一个单独的文件。
示例inputfile.txt
abc123def456
state0apples bananas0911
我的脚本应该创建: outputfile.txt 其中应包含:
state0apples bananas0911
到目前为止我的程序似乎没有起作用:
state0 = "state0"
state1 = "state1"
state2 = "state2"
state3 = "state3"
state4 = "state4"
with open('C:/inputfile.txt', 'r') as inF:
for index, line in enumerate(inF):
if 'state0' in line:
with open('C:/outputfile.txt', 'w') as f:
f.write("Line #%d has string: %s" (index, line))
else if 'state1' in line:
with open('C:/output.txt', 'w') as f:
f.write("Line #%d has string: %s" (index, line))
else if 'state2' in line:
with open('C:/output.txt', 'w') as f:
f.write("Line #%d has string: %s" (index, line))
else if 'state3' in line:
with open('C:/output.txt', 'w') as f:
f.write("Line #%d has string: %s" (index, line))
else if 'state4' in line:
with open('C:/output.txt', 'w') as f:
f.write("Line #%d has string: %s" (index, line))
答案 0 :(得分:1)
你没有告诉我们你的代码做错了什么,所以很难解释为什么它做了什么 - 它可能是错误的......但我可以看到四个直接的问题。在代码实际工作之前,您必须修复所有这些问题,以及可能还有其他我未见过的问题。
Zeroth,由于简单SyntaxError
,您的代码甚至无法运行。如果你看一下Python打印出的回溯,它会非常清楚地告诉你:
else if 'state1' in line:
^
SyntaxError: invalid syntax
为什么if
之后的else
不喜欢这样?因为else
必须立即跟冒号,if
不是冒号。
您可能想要elif
:
elif 'state1' in line:
我认为这只是我们一直都在做的同样的愚蠢错字 - 但是如果你实际上不理解elif
,请参阅the tutorial。
首先,您在某些地方使用outputfile.txt
,在其他地方使用output.txt
。大概你想要所有这些行都转到同一个文件,但是其中一些文件会转到一个完全不同的文件,你可能不会在那里查找它们。
其次,您每次都使用'w'
模式打开文件。这会截断位置0处的文件 - 换句话说,它会删除之前存在的任何内容。因此,在程序结束时,只有最后一场比赛将在文件中,而不是全部。
如果您想追加到现有文件,可以在'a'
模式下打开它以进行追加,或者以'r+'
模式打开它以进行读/写,然后寻找到文件的末尾。
但我认为你实际想要的东西可能是在程序开始时创建一个新文件,删除你开始之前可能存在的任何内容,然后将所有行写入文件。为此,最简单的解决方案是在最顶层打开文件一次。像这样:
with open('C:/inputfile.txt', 'r') as inF, open('C:/outputfile.txt', 'w') as f:
第三
f.write("Line #%d has string: %s" (index, line))
您离开了%
运营商。这意味着您只是尝试将字符串"Line #%d has string: %s"
称为函数,并将其作为参数传递给index
和line
。这显然不合法,这就是为什么你得到TypeError
告诉你str
不可调用的原因。
Python为您提供了这些错误的原因:您可以告诉代码中的问题所在并修复它。不要只是运行你的代码,看到“它不起作用”,并举起双手。如果你不愿意调试,首先不要费心去编写代码,因为 nobody 可以编写正常工作的代码,或修改代码而不知道它做错了什么。
答案 1 :(得分:0)
正则表达式确实会有所帮助:
import sys
import re
rgx = re.compile(r'state[0-4]')
with open(sys.argv[1], 'r') as in_file, open(sys.argv[2], 'w') as out_file:
for n, line in enumerate(in_file):
if rgx.search(line):
out_file.write("Line #{} has string: {}".format(n, line))