У меня есть код, который работает, когда я запускаю его отдельно, но когда я запускаю его при определении его как функции, он не работает. Я не получаю никаких ошибок, поэтому он работает, однако он не извлекает последние файлы и не обновляет файл CSV, он просто говорит то же самое, что и в предыдущий день.

Это нужно для обновления отчета, и раньше он работал, когда его запускал коллега, но я не могу заставить его работать сам. Код непосредственно ниже - это то, что работает:

def typose(): 
    today = datetime.today().strftime('%d%m%Y')
    

    yesterday = datetime.now() - timedelta(1)
    yesterday1 = yesterday.strftime('%d%m%Y')
  
    




###############################################################################
#################### ESTABLISH CONNECTION TO ESENDEX SFTP #####################
###############################################################################    


# Open a transport
# host,port = "sftp.esendex.com",22
    host,port = "10.132.0.1",22
    transport = paramiko.Transport((host,port))

# Auth    
    username,password = "bocsurveys","lfxDmr4i"
    transport.connect(None,username,password)

# Go!    
    sftp = paramiko.SFTPClient.from_transport(transport)


###############################################################################
######################## PICK UP THE FILE FOR THE SMS #########################
############################### FROM ESENDEX ##################################

# Download the SMS
    filepathsms = "/FromEsendex/CX_Survey_SMS_output_2_"+today+".csv"
    localpathsms = "C:/Users/l0ad06/Desktop/Daily Feedback from Esendex/CX_Survey_SMS_output_2_"+today+".csv"
    sftp.get(filepathsms ,localpathsms)

    filepathsms2 = "/FromEsendex/CX_Survey_SMS_output_1_"+yesterday1+".csv"
    localpathsms2 = "C:/Users/l0ad06/Desktop/Daily Feedback from Esendex/CX_Survey_SMS_output_1_"+yesterday1+".csv"
    sftp.get(filepathsms2 ,localpathsms2)


    filename = "C:/Users/l0ad06/Desktop/Daily Feedback from Esendex/CX_Survey_SMS_output_2_"+today+".csv"
    filename2 = "C:/Users/l0ad06/Desktop/Daily Feedback from Esendex/CX_Survey_SMS_output_1_"+yesterday1+".csv"



###############################################################################
################## CREATING ONE RECORD PER DELIVERY NUMBER ####################
###############################################################################
    ##df1 = pandas.read_csv(filename,
    ##                usecols= ['Question Label','Answer Label',
    ##                         'Answer DateTime','Delivery Number',
    ##                         'ShipTo Number'], encoding= 'unicode_escape')
    
    df1 = pandas.read_csv(filename, usecols =[2,4,5,12,23],
                   encoding= 'unicode_escape')


    df1 = df1.rename(columns= {df1.columns[0]: "Question Label",
                             df1.columns[1]: "Answer Label",
                             df1.columns[2]: "Answer DateTime",
                             df1.columns[3]: "Delivery Number",
                             df1.columns[4]: "ShipTo Number"})

     
    
# Filter only the records with scores
    clean_data1 = df1[df1['Question Label'] != 2]
    clean_data1 = clean_data1[clean_data1["Question Label"].notnull()]
    clean_data2 = clean_data1[clean_data1['Answer Label'] != 'Error']

    clean_df1 = pandas.DataFrame(clean_data2,
                       columns = ['Answer Label',
                                  'Answer DateTime',
                                  'Delivery Number',
                                  'ShipTo Number'])

# Rename the columns
    cleandf1 = clean_df1.rename(columns={"Answer Label": "Score",
                        "Answer DateTime": "Created",
                        "Delivery Number": "Delivery",
                        "ShipTo Number": "ShipTo" }) 




    ##df2 = pandas.read_csv(filename,
    ##               usecols= ['Question Label',
    ##                       'Answer DateTime',
    ##                     'Answer Text',
    ##                   'Delivery Number',
    ##                 'ShipTo Number'], encoding= 'unicode_escape')
    
    
    df2 = pandas.read_csv(filename, usecols =[2,5,6,12,23],
                   encoding= 'unicode_escape')
  

    df2 = df2.rename(columns= {df2.columns[0]: "Question Label",
                             df2.columns[1]: "Answer DateTime",
                             df2.columns[2]: "Answer Text",
                             df2.columns[3]: "Delivery Number",
                             df2.columns[4]: "ShipTo Number"})


# Filter only the records with comments
    clean_data3 = df2[df2['Question Label'] != 1]
    clean_data3 = clean_data3[clean_data3["Question Label"].notnull()]
    clean_df2 = pandas.DataFrame(clean_data3,
                       columns = ['Answer Text',
                                'Delivery Number',
                                'ShipTo Number'])

# Rename the columns
    cleandf2 = clean_df2.rename(columns={"Answer Text": "Comment",
                                   "Delivery Number": "Delivery",
                                   "ShipTo Number": "ShipTo" }) 





  ##  df3 = pandas.read_csv(filename,
  ##                usecols= ['Classification Code','Classification Text',
  ##                              'Country Code',
  ##                            'Customer Post Code','Delivery Number',
  ##                             'GroupTo Code','GroupTo Name',
  ##                            'PGI Date','Plant Code',
  ##                           'Plant Name','Pricing Area',
  ##                           'Pricing Area Text','Sales Organisation',
  ##                         'ShipTo Number'], encoding= 'unicode_escape')
    
    df3 = pandas.read_csv(filename,
                    usecols= [7,8,9,11,12,13,14,16,17,18,19,20,22,23], encoding= 'unicode_escape')
  



    df3 = df3.rename(columns = {df3.columns[0]: "Classification Code",
                              df3.columns[1]: "Classification Text",
                              df3.columns[2]: "Country Code",
                              df3.columns[3]: "Customer Post Code",
                              df3.columns[4]: "Delivery Number",
                              df3.columns[5]: "GroupTo Code",
                              df3.columns[6]: "GroupTo Name",
                              df3.columns[7]: "PGI Date",
                              df3.columns[8]: "Plant Code",
                              df3.columns[9]: "Plant Name",
                              df3.columns[10]: "Pricing Area",
                              df3.columns[11]: "Pricing Area Text",
                              df3.columns[12]: "Sales Organisation",
                              df3.columns[13]: "ShipTo Number"})


    # dropping ALL duplicte values 
    clean_df3 = df3.drop_duplicates() 
   

    cleandf3 = clean_df3.rename(columns={"Classification Code": "Classification_Code",
                                 "Classification Text": "Classification_Text",
                                 "Customer Post Code": "Customer_Postcode",
                                 "Country Code": "Country_Code",
                                 "Delivery Number": "Delivery",
                                 "GroupTo Code": "Group_To",
                                 "GroupTo Name": "Group_To_Name",
                                 "PGI Date": "PGI_Date",
                                 "Plant Code": "Plant",
                                 "Plant Name": "Plant_Name",
                                 "Pricing Area": "Pricing_Area",
                                 "Pricing Area Text": "Pricing_Area_Description",
                                 "Sales Organisation": "Sales_Organisation",
                                 "ShipTo Number": "ShipTo"  }) 




# Join the tables
    result1 = pandas.merge(cleandf1, cleandf2, how='left', on=['Delivery','ShipTo'])


    result2 = pandas.merge(result1, cleandf3, how='left', on=['Delivery','ShipTo'])

# Check the data types
    result2.dtypes

    result2['Created'] = pandas.to_datetime(yesterday)
    
  
# Change the data types
    result2 = result2.astype({'Score': 'str',
                           'Created': 'datetime64[ns]',
                           'Delivery': 'int64',
                           'ShipTo': 'int64',
                           'Comment':'str',
                           'Classification_Code':'str',
                           'Classification_Text':'str',
                           'Country_Code':'str',
                         'Customer_Postcode':'str',
                         'Group_To': 'float',
                         'Group_To_Name':'str',  
                        'PGI_Date': 'int64',
                         'Plant':'int64',
                         'Plant_Name':'str', 
                         'Pricing_Area':'str', 
                         'Pricing_Area_Description':'str', 
                         'Sales_Organisation': 'str'
                         })


    

# Add a column that will give us the channel
    result2['Channel'] = 'SMS'

# Export to a csv
    result2.to_csv(r'C:/Users/l0ad06/Desktop/Daily Feedback from Esendex/CX_Survey_SMS_output_2_'+today+'.csv', index = False)

    schedule.every().day.at("09:00").do(typose)

Кто-нибудь знает, почему это не работает, когда я добавляю def typose():?

-2
MICHAELKM22 26 Янв 2022 в 16:49
1
"Не работает" немного расплывчато? Что случается? Есть ли ошибка?
 – 
Tom Aarsen
26 Янв 2022 в 16:51
Привет, Том, спасибо, что указали на это. Я отредактировал соответственно
 – 
MICHAELKM22
26 Янв 2022 в 16:58
Итак, в основном вы разместили ~ 400 строк кода, чтобы спросить, почему ваша функция расписания не срабатывает?
 – 
matszwecja
26 Янв 2022 в 17:05
Не совсем нет. Это вообще не работает, если вы запускаете все, кроме schedule.every().day.at("09:00").do(typose) либо
 – 
MICHAELKM22
26 Янв 2022 в 17:10

2 ответа

Лучший ответ

Существует вероятность того, что проблема может быть вызвана следующими причинами!

  1. Отступ

Вам нужно вместо того, чтобы делать следующее

 def typose():
     today = datetime.today().strftime('%d%m%Y')
  1. Проверка функции вызова

Попробуйте проверить, действительно ли следующая команда запускает код, вы можете проверьте это, выполнив этот простой тест: Изменить schedule.every().day.at("09:00").do(typose) В typose() Если это работает, то schedule.every().day.at("09:00").do(typose) не запускает или вызывает функцию typepose, поэтому вы можете изменить ее на состояние if, если оно True запускает код.

  1. Проверьте код функции

Может возникнуть проблема с вводом неправильного значения, которое выполняется без ошибок, но не работает должным образом!

Если это не поможет, дайте мне знать

0
Omar Moustafa 26 Янв 2022 в 17:08
Я думаю, я понял, команда при запуске проверяет, равно ли время или нет, если нет, она просто закрывается, поэтому вам нужна эта команда, чтобы работать вечно! Так что проверяйте вечно!
 – 
Omar Moustafa
26 Янв 2022 в 17:15
Или вы можете сохранить текущее время в переменную, а затем проверить, равно или нет
 – 
Omar Moustafa
26 Янв 2022 в 17:18
Привет, Омар, ты имеешь в виду, где написано schedule.every().day.at("09:00").do(typose). Значит, если сейчас не 09:00, он закрывается? Потому что, если я уберу расписание, оно все равно не вызовет функцию, если я запущу остальную часть кода. Код функции должен быть в порядке, как если бы я затем запускал его без def typepose(): он отлично работает
 – 
MICHAELKM22
26 Янв 2022 в 17:26
Нет, если вы удалите def typose, он будет запущен в любое время, поэтому решение заключается в том, что вам нужен вечный цикл --> если необходимое время 09:00 равно текущему времени, тогда введите type()
 – 
Omar Moustafa
26 Янв 2022 в 17:29
Ах да, кажется, я вижу, откуда ты сейчас. Я попробую. Спасибо за предложение. Очень признателен!
 – 
MICHAELKM22
26 Янв 2022 в 17:35

Ваш отступ кажется неправильным

Ваш код:

     def typose():
       today = datetime.today().strftime('%d%m%Y')

Попробуй это:

def typose():
    today = datetime.today().strftime('%d%m%Y')
0
CorBug 26 Янв 2022 в 16:55
Привет, спасибо за предложение. Однако это была моя первоначальная мысль, и она, похоже, не сработала :(
 – 
MICHAELKM22
26 Янв 2022 в 17:05