Каталог Deleting в Python

format! не может вернуть &str, потому что он всегда выделяет String. Что можно сделать, это вернуть &str из String, что вы и сделали в своем коде.

Как намекнул компилятор, созданный String сразу же удаляется после его создания, потому что он вышел из текущей области видимости, и одним из способов может быть внешняя переменная, которая не ограничена областью match. Например :

use std::fmt::Write;

fn main() {
    let mut buffer = String::with_capacity(20);
    buffer.push_str("It's a ");

    let x = 10;
    let category = match x {
        0...9 => "Between 0 and 9",
        number @ 10 => {
            write!(&mut buffer, "{}", number).unwrap();
            buffer.as_str()
        }
        _ if x < 0 => "Negative",
        _ => "Something else",
    };

    println!("{}", category);
}

Если вы хотите среду [no_std] или не хотите выполнять динамическое распределение, вы можете взглянуть на этот ограниченный фрагмент кода:

use core::str;

fn each_digit<F>(mut number: u32, mut f: F)
where
    F: FnMut(u8),
{
    while number > 0 {
        f((number % 10) as u8);
        number /= 10;
    }
}

fn main() {
    const BUFFER_LEN: usize = 20;
    let mut buffer = [0u8; BUFFER_LEN];

    let x = 12344329;
    let category = match x {
        0...9 => "Between 0 and 9",
        number @ 123443219 => {
            let mut idx = BUFFER_LEN;
            each_digit(number, |digit| {
                let ascii = digit + 48;
                idx -= 1;
                buffer[idx] = ascii;
            });
            str::from_utf8(&buffer[idx..BUFFER_LEN]).unwrap()
        },
        _ => "Something else",
    };

    assert_eq!("123443219", category);
}
31
задан Brian Tompsett - 汤莱恩 4 July 2015 в 13:27
поделиться

5 ответов

shutil.rmtree может принимать функцию обработки ошибок, которая будет вызываться при возникновении проблемы с удалением файла. Вы можете использовать это для принудительного удаления проблемных файлов.

На основе http://mail.python.org/pipermail/tutor/2006-June/047551.html и http://techarttiki.blogspot.com/2008/08/read-only-windows-files-with-python.html :

import os
import stat
import shutil

def remove_readonly(func, path, excinfo):
    os.chmod(path, stat.S_IWRITE)
    func(path)

shutil.rmtree(top, onerror=remove_readonly)

(Я не тестировал этот фрагмент, но он должен быть достаточно, чтобы вы начали)

44
ответ дан 27 November 2019 в 22:15
поделиться

Если вы импортируете win32api из PyWin32, вы можете использовать:

win32api.SetFileAttributes(path, win32con.FILE_ATTRIBUTE_NORMAL)

, чтобы файлы перестали быть доступными только для чтения.

3
ответ дан Paul 27 November 2019 в 22:15
поделиться

На сайте ActiveState есть комментарий:

shutil.rmtree имеет свои недостатки. Хотя это правда, что во многих случаях вы можете использовать shutil.rmtree (), в некоторых случаях это не работает. Например, файлы, помеченные только для чтения в Windows, не могут быть удалены с помощью shutil.rmtree ().

Путем импорта модулей win32api и win32con из PyWin32 и добавления строки, такой как «win32api.SetFileAttributes (path, win32con.FILE_ATTRIBUTE_NORMAL») в функцию rmgeneric (), это препятствие можно преодолеть. Я использовал этот подход, чтобы исправить Сценарий hot-backup.py в Subversion 1.4, поэтому он будет работать под Windows. Спасибо за рецепт.

Я не использую Windows, поэтому не могу проверить, работает это или нет.

2
ответ дан ire_and_curses 27 November 2019 в 22:15
поделиться

Это, вероятно, будет исправлено с выпуском Python 3.5 (в настоящее время - июнь 2015 г. - все еще в разработке) в смысле указания на это в документации.

Вы можете найти отчет об ошибке здесь . И это является соответствующим набором изменений.

См. Недавно добавленный пример из документов Python 3.5 :

import os, stat
import shutil

def remove_readonly(func, path, _):
    "Clear the readonly bit and reattempt the removal"
    os.chmod(path, stat.S_IWRITE)
    func(path)

shutil.rmtree(directory, onerror=remove_readonly)
.
2
ответ дан mozzbozz 27 November 2019 в 22:15
поделиться

Вот вариант того, что написал Стив, он использует тот же базовый механизм, и этот протестирован : -)

Какой пользователь запускает скрипты python как в Windows?

2
ответ дан 27 November 2019 в 22:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: