{"id":664,"date":"2023-04-18T09:49:30","date_gmt":"2023-04-18T01:49:30","guid":{"rendered":"https:\/\/scutvk.cn\/?p=664"},"modified":"2023-10-20T11:51:53","modified_gmt":"2023-10-20T03:51:53","slug":"python%e5%a4%9a%e7%ba%bf%e7%a8%8b%e5%a4%8d%e5%88%b6-%e5%b7%a5%e5%85%b7%e8%84%9a%e6%9c%ac","status":"publish","type":"post","link":"https:\/\/scutvk.cn\/?p=664","title":{"rendered":"Python\u591a\u7ebf\u7a0b\u590d\u5236 \u5de5\u5177\u811a\u672c"},"content":{"rendered":"\n<p>\u7528\u4e8e\u66ff\u4ee3\u8d85\u6162\u7684\u5355\u7ebf\u7a0bcp -r\uff0c\u57fa\u672c\u6b3e\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python line-numbers\">import os\nimport shutil\nfrom concurrent.futures import ThreadPoolExecutor\n\ndef copy_file(src, dest):\n    try:\n        shutil.copy2(src, dest)\n        print(f\"{src} \u590d\u5236\u5230 {dest} \u6210\u529f\u3002\")\n    except Exception as e:\n        print(f\"\u590d\u5236\u6587\u4ef6 {src} \u5931\u8d25\u3002\u9519\u8bef\uff1a{e}\")\n\ndef process_directory(src_folder, dest_folder, executor):\n    if not os.path.exists(dest_folder):\n        os.makedirs(dest_folder)\n\n    for item in os.listdir(src_folder):\n        src = os.path.join(src_folder, item)\n        dest = os.path.join(dest_folder, item)\n\n        if os.path.isdir(src):\n            process_directory(src, dest, executor)\n        else:\n            executor.submit(copy_file, src, dest)\n\ndef multi_threaded_copy(src_folder, dest_folder, threads=5):\n    if not os.path.exists(dest_folder):\n        os.makedirs(dest_folder)\n\n    with ThreadPoolExecutor(max_workers=threads) as executor:\n        process_directory(src_folder, dest_folder, executor)\n\nif __name__ == \"__main__\":\n    source_folder = \"\u76ee\u6807\u76ee\u5f55\" # \u8bf7\u66ff\u6362\u4e3a\u5b9e\u9645\u7684\u76ee\u6807\u76ee\u5f55\n    destination_folder = \"\u6307\u5b9a\u76ee\u5f55\" # \u8bf7\u66ff\u6362\u4e3a\u5b9e\u9645\u7684\u6307\u5b9a\u76ee\u5f55\n    num_threads = 256 # \u6307\u5b9a\u7ebf\u7a0b\u6570\u91cf\uff0c\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8c03\u6574\n\n    multi_threaded_copy(source_folder, destination_folder, num_threads)\n<\/code><\/pre>\n\n\n\n<p>\u6dfb\u52a0tqdm\u8fdb\u5ea6\u6761\u3001\u4f7f\u7528logging\u4ee3\u66ffprint\u3001\u6dfb\u52a0\u8df3\u8fc7\u76ee\u5f55\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python line-numbers\">import os\nimport shutil\nfrom concurrent.futures import ThreadPoolExecutor\nfrom tqdm import tqdm\nimport logging\n\nlogging.basicConfig(level=logging.INFO, format=\"%(message)s\")\nlogger = logging.getLogger(__name__)\nprint_logger_successful_message = False\nprint_logger_fail_message = True\nprint_logger_skip_message = True\n\ndef copy_file(src, dest):\n    try:\n        shutil.copy2(src, dest)\n        if print_logger_successful_message:\n            logger.info(f\"{src} \u590d\u5236\u5230 {dest} \u6210\u529f\u3002\")\n    except Exception as e:\n        if print_logger_fail_message:\n            logger.error(f\"\u590d\u5236\u6587\u4ef6 {src} \u5931\u8d25\u3002\u9519\u8bef\uff1a{e}\")\n\ndef process_directory(src_folder, dest_folder, executor, pbar, skip_paths):\n    if not os.path.exists(dest_folder):\n        os.makedirs(dest_folder)\n\n    for item in os.listdir(src_folder):\n        src = os.path.join(src_folder, item)\n        dest = os.path.join(dest_folder, item)\n\n        if src in skip_paths:\n            if print_logger_skip_message:\n                logger.info(f\"\u8df3\u8fc7 {src}\")\n            continue\n\n        if os.path.isdir(src):\n            process_directory(src, dest, executor, pbar, skip_paths)\n        else:\n            executor.submit(copy_file, src, dest)\n            pbar.update(1)\n\ndef count_files(src_folder, skip_paths):\n    total_files = 0\n    for root, _, files in os.walk(src_folder):\n        if root not in skip_paths:\n            total_files += len(files)\n    return total_files\n\ndef multi_threaded_copy(src_folder, dest_folder, threads=5, skip_paths=None):\n    if skip_paths is None:\n        skip_paths = []\n\n    if not os.path.exists(dest_folder):\n        os.makedirs(dest_folder)\n\n    total_files = count_files(src_folder, skip_paths)\n\n    with ThreadPoolExecutor(max_workers=threads) as executor:\n        with tqdm(total=total_files, desc=\"\u590d\u5236\u6587\u4ef6\", unit=\"file\") as pbar:\n            process_directory(src_folder, dest_folder, executor, pbar, skip_paths)\n\nif __name__ == \"__main__\":\n    source_folder = \"\" # \u8bf7\u66ff\u6362\u4e3a\u5b9e\u9645\u7684\u76ee\u6807\u76ee\u5f55\n    destination_folder = \"\" # \u8bf7\u66ff\u6362\u4e3a\u5b9e\u9645\u7684\u6307\u5b9a\u76ee\u5f55\uff0c\u8bf7\u5e26\u4e0a\u6700\u540e\u7684\u76ee\u5f55\u540d\n    num_threads = 256 # \u6307\u5b9a\u7ebf\u7a0b\u6570\u91cf\uff0c\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8c03\u6574\n    print_logger_successful_message = False  # \u662f\u5426\u6253\u5370\u6210\u529f\u7684\u65e5\u5fd7\u4fe1\u606f\n    print_logger_fail_message = True # \u662f\u5426\u6253\u5370\u5931\u8d25\u7684\u65e5\u5fd7\u4fe1\u606f\n    print_logger_skip_message = True # \u662f\u5426\u6253\u5370\u8df3\u8fc7\u7684\u65e5\u5fd7\u4fe1\u606f\n    # \u5c06\u8981\u8df3\u8fc7\u7684\u8def\u5f84\u6dfb\u52a0\u5230\u6b64\u6570\u7ec4\u4e2d\n    skip_paths = []\n\n    multi_threaded_copy(source_folder, destination_folder, num_threads, skip_paths)<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u7528\u4e8e\u66ff\u4ee3\u8d85\u6162\u7684\u5355\u7ebf\u7a0bcp -r\uff0c\u57fa\u672c\u6b3e\uff1a \u6dfb\u52a0tq&hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_publicize_message":"","jetpack_is_tweetstorm":false,"jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","enabled":false}}},"categories":[5],"tags":[],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/scutvk.cn\/index.php?rest_route=\/wp\/v2\/posts\/664"}],"collection":[{"href":"https:\/\/scutvk.cn\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/scutvk.cn\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/scutvk.cn\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/scutvk.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=664"}],"version-history":[{"count":6,"href":"https:\/\/scutvk.cn\/index.php?rest_route=\/wp\/v2\/posts\/664\/revisions"}],"predecessor-version":[{"id":699,"href":"https:\/\/scutvk.cn\/index.php?rest_route=\/wp\/v2\/posts\/664\/revisions\/699"}],"wp:attachment":[{"href":"https:\/\/scutvk.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=664"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/scutvk.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=664"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/scutvk.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=664"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}