【问题标题】:Skip bad EOL in Python在 Python 中跳过错误的 EOL
【发布时间】:2013-11-05 11:32:51
【问题描述】:

我正在使用subprocess从 Linux 中的 CAT 管道读取数据:

stdout=subprocess.PIPE

所以有些行有 BAD EOL,这是一个巨大的文件,我想跳过这些行并转到下一行。我如何在 Python 中做到这一点?

PS:我总是得到:

SyntaxError: EOL while scanning string literal

并且似乎某些套接字在写入该文件时停止了,因为我在该文件的末尾看到了非常大的空间。不想修,想跳过

这是我的代码:

import sys,os
import subprocess
import traceback
import re
import ast




try :
        cat = subprocess.Popen(["hadoop", "dfs", "-cat", "PATH TO FILE"], stdout=subprocess.PIPE)
        for data in cat.stdout:
                data = re.sub(' +',' ',data)
                msg= ast.literal_eval(data)
                if  msg['some_string'] == 'some_string' :
                        print msg['status']
                else :
                        continue
except :
        print traceback.format_exc()
        pass
exit()

所以程序退出前的输出: 许多空格和...

                                                        ^

SyntaxError:扫描字符串文字时 EOL

【问题讨论】:

  • 您的 Python 代码 中有语法错误,而不是在 cat 管道中。
  • 请出示您的相关代码。看起来错误来自那里。
  • literal_eval之前打印出data,这可能会给我们一个战斗的机会。
  • 这个东西甚至在系统文件上,如果你尝试 cat 那个文件,同样的问题会发生,我知道文件本身就是问题,但无论如何我手动设置 EOL 并移动到下一行并继续处理,知道我确定该行之后有数据

标签: python pipe eol


【解决方案1】:

在这里,试试这个:

import sys,os
import subprocess
import traceback
import re
import ast




try :
        cat = subprocess.Popen(["hadoop", "dfs", "-cat", "PATH TO FILE"], stdout=subprocess.PIPE)
        for data in cat.stdout:
                data = re.sub(' +',' ',data)
                try:
                    msg= ast.literal_eval(data)
                    if  msg['some_string'] == 'some_string' :
                        print msg['status']
                    else :
                        continue
                except SyntaxError:
                    continue #skip this line

except :
        print traceback.format_exc()
        pass
exit()

希望对你有帮助!

【讨论】:

    【解决方案2】:

    要跳过错误,您可以编写如下代码:

    try:
        your code
    except {Your error}:
        pass
    

    try:
        your code
    except:
        pass
    

    所有错误

    你也可以这样使用:

    import sys
    import traceback
    
    try:
        {code}
    except Exception:
        _type, _value, _trace = sys.exc_info()
        print "Type:\n\t{0}\nException:\n\t\t{1}\nTraceback:\n\t{2}".format(
              _type, _value, traceback.format_tb(_trace))
    

    【讨论】:

    • 如果同一文件中存在语法错误,则不能。即使这子进程的EOL问题,这并不意味着您可以忽略它并愉快地继续从管道中读取。
    • 这不会跳过任何内容,错误在 Python 文件中。这只会中止进程。
    • 请注意,您很少想要使用笼统的 except: 声明。如果要捕获所有异常,请改用except Exception: 而不是捕获SystemExitKeyboardInterrupt 异常。
    • 公平地说,看起来这样(根据其except SyntaxError: 变体)将是正确的方法。该异常不是由 Python 文件中的 SyntaxError 引起的,而是由 ast.literal_eval 引发的。
    • 我写了最简单的方法来抑制引发的异常。很明显,问题不在于 python 语法。有时你只需要代码工作,即使出现错误。 pass in except block 是最好的临时方法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 2021-05-28
    • 1970-01-01
    • 2015-04-30
    • 1970-01-01
    相关资源
    最近更新 更多