Python尝试除了不执行

时间:2019-01-02 20:46:27

标签: python python-2.7

我已经编写了一个脚本,该脚本应该自动使用大熊猫获取数据框并与之交互,然后将其放入网络的另一部分作为参考,然后与SmartSheets进行交互。它使用了非常基本的API,并且大多数功能和逻辑都运行良好,但是唯一的问题是应该在最后进行尝试的tryexcept块。

没有抛出任何错误,它只是位于空白终端中;这很奇怪,因为如果我堆叠一个接一个地编写的函数,它们将毫无问题地工作。

这个tryexcept块是这样的,它可以帮助在机器上写出错误,并最终在脚本的后面放入调度功能。

此脚本位于运行Ubuntu 18.04的VM上。它是用Python 2编写的。

我在线上进行了研究,但找不到try try块不会出错且无法执行的情况。我确保我在IDE(Atom)上的缩进正确(4个空格)。我可以自己排列这4个函数,它们可以正常执行而没有错误。

import os
import sys
import datetime
import tempfile
import smartsheet
import glob
import warnings
import platform
import pandas as pd
import math
from apscheduler.schedulers.blocking import BlockingScheduler

#variables
warnings.simplefilter(action='ignore', category=FutureWarning)

now = datetime.datetime.now()

PATH = "/mnt/cifs/rxlog.csv"

csvpath = "/home/ajskrilla/csvtest.csv"

End = '.csv'

today = now.strftime("%Y-%m-%d %H:%M")

path1 = "/mnt/cifs1"+"/Reports"+ now.strftime("%Y-%m-%d")+"/log Import"

path_glob = "/mnt/cifs1"+"/Reports"+ now.strftime("%Y-%m-%d")+"/log Import"+now.strftime("%Y-%m-%d")

Files_to_compare = glob.glob('/mnt/cifs1'+"/Reports"+ now.strftime("%Y-%m-%d")+'/log Import'+now.strftime("%Y-%m-%d")+'*.csv')

Fpath =  path1 + now.strftime("%Y-%m-%d %H:%M") + End

SSName = 'Call Sheet/NDC ' + now.strftime("%Y-%m-%d %H:%M") + End

list_of_files = Files_to_compare

sched = BlockingScheduler()

#start of process

def Import_csv():

    data_file = pd.read_csv(PATH, error_bad_lines=False, sep="|", parse_dates=True, low_memory=False, quotechar=None, quoting=3)

    data_file.to_csv(csvpath)

def Clean_CSV():

    file_path_directory = "/mnt/cifs1/"+"Reports" + now.strftime("%Y-%m-%d")

    if not os.path.exists(file_path_directory):

        os.makedirs(file_path_directory)

    fields=['RXNBR', 'RX STOREID', 'FILLDATE', 'PATNAMELAST', 'PATNAMEFIRST', 'NH NBR', 'RX HOLD STATUS', 'RX HOLD REASON']

    df = pd.read_csv(csvpath, skipinitialspace=True, usecols=fields, low_memory=False)

    df.columns = ['RXNBR','RX_STOREID', 'FILLDATE', 'PATNAMELAST', 'PATNAMEFIRST', 'NH_NBR', 'RX_HOLD_STATUS', 'RX_HOLD_REASON']

    nf = df[df.NH_NBR == 0][df.RX_HOLD_STATUS != 'Online Queued']

    with tempfile.NamedTemporaryFile(delete=False) as temp:

        nf.to_csv(Fpath, index=False)

def Compare_files():

    if platform.system() == 'Linux':

        if len(list_of_files) > 2:

            latest_file = min(list_of_files, key=os.stat)

            first_file = max(list_of_files, key=os.stat)

            one_file= pd.read_csv(first_file)

            two_file= pd.read_csv(latest_file)

            out = one_file.append(two_file)

            out.drop_duplicates('RXNBR', inplace=True)

            with tempfile.NamedTemporaryFile(delete=False) as temp:

                out.to_csv(Fpath, index=False)

                for file in list_of_files:

                    if file != latest_file:

                        for files in list_of_files:

                            os.remove(files)

        else:

            pass

        #delete the old file

def SS_import():

    ss_client = smartsheet.Smartsheet("BANNERID#")

    ss_client.errors_as_exceptions(True)

    imported_sheet = ss_client.Workspaces.import_csv_sheet(

# need to change this based upon workspace ID

    xxxxxxxxxxxxxxxx, #WS ID

    Fpath,

    SSName,

    header_row_index=0

    )


def SS_delete():

    ss_client = smartsheet.Smartsheet("BANNNERID#")

    action = ss_client.Sheets.list_sheets(include_all=True)

    for single_sheet in action.data:

        Sheetid= single_sheet.id

        ss_client.Sheets.delete_sheet(

        single_sheet.id)
######################################################################################################################################

#this is where the issue arises, during this function

#full fnct with error handling

def NDC_import():

    try:

        Import_csv()

    except Exception as E:

        Import_error_file = open('/mnt/Error Files/IE Error' + now.strftime("%Y-%m-%d %H:%M") + '.txt', 'w+')

        for line in Import_error_file:

            line.write(E)

            line.close()

            sys.exit()


    try:

        Clean_CSV()

    except Exception as E:

        Clean_CSV_error = open('/mnt/Error Files/CC Error' + now.strftime("%Y-%m-%d %H:%M") + '.txt', 'w+')

        for line in Clean_CSV_error:

            line.write(E)

            line.close()

            sys.exit()

    try:

        Compare_files()

    except Exception as E:

        Compare_files_error = open('/mnt/Error Files/CF Error' + now.strftime("%Y-%m-%d %H:%M") + '.txt', 'w+')

        for line in Compare_files_error:

            line.write(E)

            line.close()

            sys.exit()

    try:

        SS_import()

    except Exception as E:

        SS_import_error = open('/mnt/Error Files/SSI Error' + now.strftime("%Y-%m-%d %H:%M") + '.txt', 'w+')

        for line in SS_import_error:

            line.write(E)

            line.close()

            sys.exit()

NDC_import()

NDC_import()函数运行脚本时,它根本不会执行。如果四个功能Import_csv()Clean_CSV()Compare_files()SS_import()本身就是它们,它们将正常执行。

为什么除了我写的代码块,它不能在那次尝试中运行?它甚至不会引发错误,并且终端为空白。

2 个答案:

答案 0 :(得分:1)

我认为主要问题与您的异常处理有关。特别是,您要以w+模式打开文件,然后遍历打开的文件-并非完全是语法错误,而是功能上已损坏。还值得注意的是,如果没有错误,则不应期望看到任何打印输出。

我建议完全改变错误的方向,并考虑使用神话般的logging库。

如何使用它的一个例子是

# ... other imports
import logging

# ... your function definitions
def NDC_Import():
    try:
        Import_csv()
    except Exception as E:
        logging.exception('error during Import_csv()')
        return

    # and so on ...

logging.exception()行将打印出整个回溯到配置的任何记录器,您可以configure it to log to a file

答案 1 :(得分:0)

您正在以w+模式打开文件。示例:

SS_import_error = open('/mnt/Error Files/SSI Error' + now.strftime("%Y-%m-%d %H:%M") + '.txt', 'w+')

w+表示如果文件不存在,它将创建文件;如果文件不存在,则将覆盖文件。这意味着SS_import_error将始终在此行之后指向一个空文件。然后,您立即尝试遍历该文件的所有行:

for line in SS_import_error:
    line.write(E)
    line.close()
    sys.exit()

但是,尝试循环一个空文件的行将立即结束,而无需执行该块中的代码。最终结果是运行except块,但实际上不执行任何操作(除了可能擦除文件之外)。

我不完全知道您打算for循环要做什么,所以我无法建议解决方法。