Скрипт бекапа ругается на кодировку имен файлов

evgen19877

Новичок
Пользователь
Апр 7, 2023
3
0
1
Подскажите пожалуйста, Win 10, Python 3.10 пишу скрипт бекапа, на моём компе отладил, все работает. На сервере запускаю, начинает ругаться на кодировку ошибка unicodeencodeerror. Там фалов под 150000, пару файлов с именем на чешском я удалил, потом он стал вылетать на русских названиях.

Этот код создает список файлов и их времени изменения в указанных папках, сохраняет этот список в файл "arc.lst". Затем он сравнивает этот список с предыдущим списком, хранящимся в файле "arc.lst". Если файл "arc.lst" не существует, то это означает, что это первый запуск скрипта, и список файлов для архивации будет полным. Если файл "arc.lst" существует, то скрипт создаст новый список файлов, которые были изменены с момента последнего запуска скрипта, и сохранит его в файл "diff.lst". Затем скрипт создаст архив с помощью утилиты 7z.exe, используя файл "diff.lst" для выбора файлов, которые будут добавлены в архив. Созданный архив будет иметь имя, содержащее дату и время создания.

Python:
from pathlib import Path
import datetime,os
arcname=""
lst=[]
diff=[]
lstarc=[]
listfile="arc.lst"
now = datetime.datetime.now()

def convert_date(timestamp):
     d = datetime.utcfromtimestamp(timestamp)
     formated_date = d.strftime('%d %b %Y')
     return formated_date

def scanlst(name):           #Полное сканирование пути и составление списка LST
    for txt_path in Path(name).glob("**/*.*"):
        if txt_path.is_file():
            resline =str(txt_path)+" "+str(txt_path.lstat().st_mtime)
            print("Обнаружен файл ", resline)
            lst.append(resline)

def createlist():        #Если обнаружены новые файлы создаем или перезаписываем LIST файл
    with open(listfile, "w") as result:
        for l in lst:
            result.writelines('%s\n' % l)  #Переход каретки + строка пути и времени
            print(l)

    print("createlist отработал")
    with open("diff.lst", "w") as diffile:        #Записываем DIFF файл
        for l in diff:
            diffile.writelines('%s\n' % l.rpartition(' ')[0])

def arc(lst):                #Кладем в архив список из DIFF файла
    print("7Z begin", arcpath)
    cmd = r'7z.exe a -mx3 -scsWIN -spf '+arcpath.strip()+'-'+now.strftime("%Y-%m-%d-%H-%M")+'.7z @"diff.lst'
#                         strip отсекает переход каретки
    os.system(cmd)


if __name__ == '__main__':
    print("Старт "+now.strftime("%Y-%m-%d-%H-%M"))
    with open("arc.cfg", "r") as filecfg:
        arcpath=filecfg.readline()
        for line in filecfg:
             print("Сканируем каталог ",line)
             scanlst(line.strip())
            

    if not Path(listfile).is_file():  #Новый файл
        diff=lst
        createlist()
        arc(lst)
    else:                               #Не первый запуск
        with open(listfile, "r") as result:   #Чтение списка что в архиве
            for line in result:
                lstarc.append(line.rstrip())
        diff = list(set(lst) - set(lstarc))
        if len(diff)>0:
            createlist()
            print("Разных файлов обнаружено", len(diff))
            arc(diff)
            print("Разных файлов обнаружено", len(diff))
        else:
            print("Разных и новых файлов не обнаружено")
    print("Успешно.", now.strftime("%Y-%m-%d-%H-%M"))

сожержание файла arc.cfg
c:\backup # куда складывать архивы
c:\1c #Далее что бекапиться
c:\1cv8 #Далее что бекапиться
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 661
474
83
ругается где? на какой строке? при чтении из файлов? попробуйте добавить encoding="utf-8"
 

evgen19877

Новичок
Пользователь
Апр 7, 2023
3
0
1
chat gpt тоже так ответил.
25 строка result.writelines('%s\n' % l) #Переход каретки + строка пути и времени
1680916844071.png
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 661
474
83
chat gpt тоже так ответил.
25 строка result.writelines('%s\n' % l) #Переход каретки + строка пути и времени
Посмотреть вложение 2296
Ну так кодировка то помогла?
 

evgen19877

Новичок
Пользователь
Апр 7, 2023
3
0
1
вставлял в трех местах, где происходит обращение к файлам. Там другая ошибка пошла. Пишет названия файла кракозяброй и нет перехода каретки, т.е. одной строкой.
Можете запустить у себя, если у вас среда Винда, возможно отработает правильно. До первого файла с другой кодировкой в имени-расширении
 

Форум IT Специалистов