Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.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_Parsing_File Io_Enumerate - Fatal编程技术网

Python 解析脚本-乱码文本

Python 解析脚本-乱码文本,python,parsing,file-io,enumerate,Python,Parsing,File Io,Enumerate,我有一个需要解析的文本文件。 在这个文本文件中,单词、数字、空格等在这个文件中没有特定的顺序 此.txt文件中的某些点将出现以下字符串: state0 当我看到这一点时,我需要将整行解析成一个单独的文件 示例inputfile.txt abc123def456 state0apples bananas0911 我的脚本应该创建: outputfile.txt 其中应包括: state0apples bananas0911 到目前为止,我的程序似乎不起作用: state0 = "state0

我有一个需要解析的文本文件。 在这个文本文件中,单词、数字、空格等在这个文件中没有特定的顺序

此.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))

你还没有告诉我们你的代码做错了什么,所以很难解释为什么它会做任何可能是错误的事情……但我可以看到四个直接的问题。在代码实际运行之前,您必须修复所有这些问题,可能还有我没有见过的其他问题


第零,您的代码甚至不会运行,因为一个简单的
SyntaxError
。如果您查看Python打印出来的回溯,它会非常清楚地告诉您:

    else if 'state1' in line:
          ^
SyntaxError: invalid syntax
为什么它不像这样在一个
else
之后加一个
if
?因为
else
后面必须紧跟冒号,如果
不是冒号,则必须紧跟在
后面

您可能想要
elif

    elif 'state1' in line:
我想这是我们一直在犯的同一种愚蠢的打字错误,但万一你真的不明白,请参见


首先,在某些地方使用
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具有字符串:%s”
,就好像它是一个函数一样,将它作为参数传递给
索引和
Line
。这显然是不合法的,这就是为什么你会得到一个
TypeError
告诉你
str
是不可调用的



Python给您这些错误是有原因的:这样您就可以知道代码中的问题在哪里,并修复它。不要只是运行你的代码,看到“它没有工作”,然后把手举到空中。如果您不愿意调试,那么首先就不要麻烦编写代码,因为没有人可以编写正常工作的代码,或者在不知道错误的情况下修复代码。

正则表达式确实会有帮助:

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

“似乎不起作用”是什么意思?这是一个例外吗?不创建文件?创建一个空文件?创建一个仅包含一个匹配项而不是所有匹配项的文件,或格式错误的文件,或使用唐吉诃德的翻译版本而不是您期望的文本的文件?请不要将您的问题编辑为完全不同的问题,因为现有答案都不再适用。这对将来和你有同样问题的人来说是无用的。你可以把你从一个答案中得到的新版本添加到最后,但永远不要删除问题所涉及的原始版本。另外,不要试图在评论中发布回溯;把它们添加到问题中。如果没有格式,它们是完全不可读的,而且大多数人无论如何都不会查看注释。更重要的是,它不是调试代码的服务。如果我想看到您发现的每个错误,并告诉您如何逐一修复它们,我会亲自运行您的代码,并自行修复,而不会有人阻拦我和解释器。但是,除非你想付钱给我,否则我没有兴趣这么做,我怀疑其他人也没有兴趣这么做。您必须学会如何自己调试代码。当你陷入困境时,你可以写一个问题,请求帮助你摆脱困境。为什么你要用手动跟踪
n
来代替OP的干净
enumerate
?我不理解你是如何“添加了你在底部添加的代码”。如果您只是将该行添加到文件的底部,或将其放在顶部,但仍然在循环中一次又一次地打开该文件,或者其他类似的内容,那么这显然不会有任何帮助。另外,如果您按照我描述的方式更改它,当然它不会生成
output.txt
——它会打开并写入一个名为
outputfile.txt
,正如您的问题描述所要求的那样,@user3183936:同时,不,“state0”不必位于文件的开头,甚至不必位于行的开头。您可以自己测试:打开一个交互式Python会话,然后在“foostate0bar”
中键入
“state0”,看看它是说
True
还是
False
@user3183936:最后,“命令屏幕弹出并立即消失”没有帮助。在不查看程序输出的情况下调试程序几乎是不可能的。打开一个命令提示符(又名“DOS提示符”)并在那里运行程序,或者在IDLE或PythonWin或类似的GUI中运行它,这样您就可以看到它正在打印什么。对于@abarnert造成的混乱,我深表歉意。我将更新我的OP以显示我当前拥有的内容。