Przepisanie skryptu z Pythona 2 do 3

0

Cześć, miałem skrypt działający napisany w Python i chciałbym go przerobić do wersji Python 3.9. Nie jestem programistą, więc zrobiłem parę poprawek, ale skrypt pokazuje błąd podczas wykonania:

File "/home/test.py", line 96
    if plik.startswith(("KK", "TT")):
TabError: inconsistent use of tabs and spaces in indentation

Możecie doradzić, co jeszcze musiał bym zmienić, żeby ten skrypt zadziałał ?

#!/usr/bin/env python3.9

import os
from os.path import join, getsize
import sys
import smtplib
import glob
import fnmatch
from email.MIMEMultipart import MIMEMultipart
from email.MIMEBase import MIMEBase
from email.MIMEText import MIMEText
from email.Utils import COMMASPACE, formatdate
from email import Encoders
from email import Charset
import time
import logging
import ConfigParser


config = ConfigParser.RawConfigParser()
config.read('/home/listt/listt_test.conf')
adres_serwera = config.get('serwer', 'adres_serwera')
logdir = config.get('log', 'logdir')
mail_from = config.get('mail', 'mail_nadawcy')
mail_password = config.get('mail', 'mail_haslo')
mail_temat_fakk = config.get('mail', 'mail_temat_fakk')
mail_tekst = config.get('mail', 'mail_tekst')
przedst = config.get('konttr', 'adress_file')
home_dir = config.get('konttr', 'home_dir')



dzisiaj = time.strftime('%Y%m%d')
wiersz = []


fp = open(mail_tekst, 'rb')
mail_tekst = fp.read() 
fp.close()
logfile = dzisiaj+"_plik.log"

if not os.path.exists(logdir):
  os.mkdir(logdir)
logfile = logdir+logfile

if not os.path.exists(logfile):
  print("NIE MA PLIKU LOGOW, tworze plik")
  logging.basicConfig(format='%(asctime)s %(levelname)s: %(message)s', filename=logfile, filemode='w', level=logging.DEBUG)
else: 
  logging.basicConfig(format='%(asctime)s %(levelname)s: %(message)s', filename=logfile, filemode='a', level=logging.DEBUG)

s = smtplib.SMTP_SSL()
s.connect(adres_serwera,465)
s.login(mail_from, mail_password)

def sendMail(to, subject, text, files=[],server=adres_serwera):
    assert type(to)==list
    assert type(files)==list


    msg = MIMEMultipart()
    msg['From'] = mail_from
    msg['To'] = COMMASPACE.join(to)
    msg['Date'] = formatdate(localtime=True)
    msg['Subject'] = subject
    msg.attach( MIMEText(text, 'plain', 'UTF-8'))

    for file in files:
        part = MIMEBase('application', "octet-stream")
        part.set_payload( open(file,"rb").read() )
        Encoders.encode_base64(part)
        part.add_header('Content-Disposition', 'attachment; filename="%s"'
    	            % os.path.basename(file))
        msg.attach(part)

    s.sendmail(mail_from, to, msg.as_string() )


file = open(przedst, "r")
for nr,line in enumerate(file): 
  line = line.strip()
  string = line
  if line:
    wiersz.append(line) 
    folder, mail = wiersz[nr].split(",") 
    print(mail)
    for path, dirs, files in os.walk(home_dir+folder): 
      print(path, files)
      pliki = [] 
      pliki.append(path) 
      lista_plikow=[]
      for plik in files: 


    	if plik.startswith(("KK", "TT")):

	    plik = pliki[0]+os.sep+plik 
    	    lista_plikow.append(plik)
      print(lista_plikow)
      if len(lista_plikow) == 0:
         temat = 0
      elif len(lista_plikow) == 1: 
        try:
         sendMail([mail], mail_temat_fakk, mail_tekst ,lista_plikow)
        except smtplib.SMTPConnectError as komunikat:
         logging.warning(komunikat)
        except smtplib.SMTPAuthenticationError as komunikat:
         logging.warning(komunikat)
        except smtplib.SMTPRecipientsRefused as komunikat:
         logging.warning(komunikat)
        except smtplib.SMTPResponseException as  komunikat:
         logging.warning(komunikat)
        else:
         for plik in lista_plikow:
           to_log = "wyslano wiadomosc do: "+mail+" z plikiem "+plik
           print(to_log)
         os.remove(plik) 
      else: 
 
        try:
         sendMail([mail], mail_temat_fakk, mail_tekst ,lista_plikow)
        except smtplib.SMTPConnectError as komunikat:
         logging.warning(komunikat)
        except smtplib.SMTPAuthenticationError as komunikat:
         logging.warning(komunikat)
        except smtplib.SMTPRecipientsRefused as komunikat:
         logging.warning(komunikat)
        except smtplib.SMTPResponseException as komunikat:
         logging.warning(komunikat)
        else:
         for plik in lista_plikow:
           to_log = "wyslano wiadomosc do: "+mail+" z plikiem "+plik
           print(to_log)
        os.remove(plik)

s.close()
1
TabError: inconsistent use of tabs and spaces in indentation

Trzeba konsekwentnie używać wcięć (albo spacje, albo tabulatory). Otwórz sobie skrypt w jakimś notepad++, daj podgląd białych znaków i zobaczysz gdzie masz spacje, a gdzie taby.

screenshot-20231005152508.png

0
yarel napisał(a):
TabError: inconsistent use of tabs and spaces in indentation

Trzeba konsekwentnie używać wcięć (albo spacje, albo tabulatory). Otwórz sobie skrypt w jakimś notepad++, daj podgląd białych znaków i zobaczysz gdzie masz spacje, a gdzie taby.

screenshot-20231005152508.png

usunąłem wszystkie i teraz mam coś takiego:

assert type(to)==list
^
IndentationError: expected an indented block
0

Usunąłeś i teraz brakuje wcięcia ;-) Trzeba ich konsekwentnie używać (albo spacje, albo tabulatory).

0

po zmianie mam coś takiego:

if plik.startswith(("KK", "TT")):
                                ^
IndentationError: unindent does not match any outer indentation level
1

Nie miałeś usunąć wszystkich — dla Pythona wcięcie jest informacją o przebiegu sterowania — ale poprawić, żeby były jednolite. Na przykład — zamieniając wszystkie taby na spacje (cztery, patrząc na obrazek wyżej).

1
aro_2003 napisał(a):

po zmianie mam coś takiego:

Zostaw to, daj komuś kto czuje podstawy.

Oprócz zmian, na które parser krzyczy jako na jawnie nielegalne, trafisz taką - a może już ją masz - która będzie formalnie poprawna, tylko sens programu sie zmieni, a z tego się nie wyratujesz

0

Zaktualizuj sobie moduły i wyjątki. Popraw sobie otwieranie pliku

1 użytkowników online, w tym zalogowanych: 0, gości: 1