我已经编写了一个脚本,该脚本应该自动使用大熊猫获取数据框并与之交互,然后将其放入网络的另一部分作为参考,然后与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()
本身就是它们,它们将正常执行。
为什么除了我写的代码块,它不能在那次尝试中运行?它甚至不会引发错误,并且终端为空白。
答案 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
循环要做什么,所以我无法建议解决方法。