Python:复制文件时创建文件夹

时间:2015-11-19 19:10:22

标签: python directory copy

我试图创建一个shell脚本,将文件从一台计算机(员工的旧计算机)复制到另一台计算机(员工的新计算机)。我知道我可以复制文件,感谢这里有可爱的人,但是我遇到了一个问题 - 如果我要从这个有两个文件的目录开始:< / p>

C:\ Users \ specificuser \ Documents \ Test Folder ....到这个目录...... C:\ Users \用户specificuser \桌面 ...我看到桌面上显示的文件,但是没有创建这些文件所在的文件夹(测试文件夹)。

以下是我使用的复制功能:

#copy function
def dir_copy(srcpath, dstpath):
    #if the destination path doesn't exist, create it
    if not os.path.exists(dstpath):
        os.makedir(dstpath)
    #tag each file to the source path to create the file path
    for file in os.listdir(srcpath):
        srcfile = os.path.join(srcpath, file)
        dstfile = os.path.join(dstpath, file)
        #if the source file path is a directory, copy the directory
        if os.path.isdir(srcfile):
            dir_copy(srcfile, dstfile)
        else: #if the source file path is just a file, copy the file
            shutil.copyfile(srcfile, dstfile)

我知道我需要在目的地上创建目录,我不太确定该怎么做。

编辑:我发现我有一个类型(os.makedir而不是os.mkdir)。我测试了它,它创建了类似它的目录。但是我喜欢它从它开始的位置创建一个级别的目录。例如,在测试文件夹中有子测试文件夹。它创建了子测试文件夹,但不会创建测试文件夹,因为测试文件夹不是dstpath的一部分。这有意义吗?

4 个答案:

答案 0 :(得分:2)

您可能需要查看shutil.copytree()。它执行您正在寻找的递归复制功能,包括目录。因此,对于基本的递归副本,您可以运行:

shutil.copytree(srcpath, dstpath)

但是,为了实现将源目录复制到目标目录的目标,在进程中创建目标目录内的源目录,可以使用以下内容:

import os
import shutil

def dir_copy(srcpath, dstdir):
    dirname = os.path.basename(srcpath)
    dstpath = os.path.join(dstdir, dirname)
    shutil.copytree(srcpath, dstpath)

请注意,您的srcpath最后不得包含斜杠才能生效。此外,加入目标目录和源目录名称的结果必须不存在,否则copytree将失败。

答案 1 :(得分:0)

import shutil
import os

def dir_copy(srcpath, dstpath):
    try:
        shutil.copytree(srcpath, dstpath)
    except shutil.Error as e:
        print('Directory not copied. Error: %s' % e)
    except OSError as e:
        print('Directory not copied. Error: %s' % e)


dir_copy('/home/sergey/test1', '/home/sergey/test2')

答案 2 :(得分:0)

这是文件复制的常见问题...您是打算只复制文件夹的内容还是要复制文件夹本身?复制实用程序通常有一个标志,你也可以。我使用os.makedirs以便创建任何中间目录。

#copy function
def dir_copy(srcpath, dstpath, include_directory=False):
    if include_directory:
        dstpath = os.path.join(dstpath, os.path.basename(srcpath))
    os.makedirs(dstpath, exist_ok=True)
    #tag each file to the source path to create the file path
    for file in os.listdir(srcpath):
        srcfile = os.path.join(srcpath, file)
        dstfile = os.path.join(dstpath, file)
        #if the source file path is a directory, copy the directory
        if os.path.isdir(srcfile):
            dir_copy(srcfile, dstfile)
        else: #if the source file path is just a file, copy the file
            shutil.copyfile(srcfile, dstfile)

答案 3 :(得分:0)

我使用这个脚本来备份(复制)我的工作文件夹。它将跳过大文件,保留文件夹结构(层次结构)并在目标文件夹不存在时创建它们。

object Destinations {
    const val ORDER_ROUTE = "order"
    const val ACCOUNT_ROUTE = "account"
    const val ITEM_LIST_ROUTE = "itemList"
    const val ITEM_DETAIL_ROUTE = "itemDetail"
    const val ITEM_DETAIL_ID_KEY = "itemId"
}

class NavigationActions(navController: NavHostController) {
    val selectItem: (Long) -> Unit = { itemId: Long ->
        navController.navigate("${Destinations.ITEM_DETAIL_ROUTE}/$itemId")
    }
    val upPress: () -> Unit = {
        navController.navigateUp()
    }
}

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            MyApp()
        }
    }
}

@Compose
fun MyApp() {
    MyAppTheme {
        val navController = rememberNavController()

        val tabs = listOf(Destinations.ORDER_ROUTE, Destinations.ACCOUNT_ROUTE)

        val navBackStackEntry by navController.currentBackStackEntryAsState()
        val currentRoute = navBackStackEntry?.arguments?.getString(KEY_ROUTE)

        Scaffold(
            bottomBar = {
                BottomNavigation {
                    tabs.forEach { tab ->
                        BottomNavigationItem(
                            icon = { Icons.Filled.Favorite },
                            label = { Text(tab) },
                            selected = currentRoute == tab,
                            onClick = {
                                navController.navigate(tab) {
                                    popUpTo = navController.graph.startDestination
                                    launchSingleTop = true
                                }
                            },
                            alwaysShowLabel = true,
                            selectedContentColor = MaterialTheme.colors.secondary,
                            unselectedContentColor = LocalContentColor.current
                        )
                    }
                }
            }
        ) {
            NavGraph(navController)
        }
    }
}

@Composable
fun NavGraph(
    navController: NavHostController,
    startDestination: String = Destinations.ORDER_ROUTE
) {
    val actions = remember(navController) { NavigationActions(navController) }

    NavHost(navController = navController, startDestination = startDestination) {
        navigation(startDestination = Destinations.ITEM_LIST_ROUTE, route = Destinations.ORDER_ROUTE) {
            composable(Destinations.ITEM_LIST_ROUTE) {
                ItemList(actions.selectItem)
            }
            composable(
                "${Destinations.ITEM_DETAIL_ROUTE}/{$Destinations.ITEM_DETAIL_ID_KEY}",
                arguments = listOf(navArgument(Destinations.ITEM_DETAIL_ID_KEY) {
                    type = NavType.LongType
                })
            ) {
                ItemDetail()
            }
        }
        composable(Destinations.ACCOUNT_ROUTE) {
            Account()
        }
    }
}