如何从txt文档中取出文本并创建一个新目录?

How to take text from a txt document and create a new directory?

挑战在于从文本文件中获取名称并在不同目录中创建新文件夹。我的问题是,当我尝试这样做时,它提到

join() argument must be str, bytes, or os.PathLike object, not 'list'

是否有一种方法可以转换列表来执行此操作,或者是否有另一种我没有看到的方法可以执行此操作?

import os

clientnames = "/home/michael/tafe/Customer Service Team/Customer Service Team new client names" #filepath/filename of new client names.

#Error handeling, if the txt file is missing then it will say the file is unavaliable.
if (os.path.isfile(clientnames)) == True:
    print("The file is avaliable, folder creation will now start.")
else:
    print("The file is unavaliable, please provide Customer Service Team new client names .txt file")

folderdir = "/home/michael/tafe/FS1/Administration/New_Customers" #filepath of where the new folders are to be created in.

#take name from txt file.
with open(clientnames, "r") as newfolder:
    for line in newfolder:
        newfolder = line.strip().split()
        created_folder = os.path.join(folderdir, newfolder)

os.mkdir(created_folder)
print("Directory '% s' created" % newfolder)

我对学习 python 还很陌生,但一旦我找到如何创建目录,我就觉得我已经接近解决这个问题了。 (挑战还有其他一些部分,但与此无关...)。

在 Visual Studio 代码上使用 Python 3.8.7 64 位。

问题出在for循环中:

with open(clientnames, "r") as newfolder:
    for line in newfolder:
        newfolder = line.strip().split()
        created_folder = os.path.join(folderdir, newfolder)

star.split() returns list 类型的对象。知道 newFolder 将是 list,

created_folder = os.path.join(folderdir, newfolder)

喜欢

created_folder = os.path.join("/home/michael/tafe/FS1/Administration/New_Customers", ["Tom", "Lam"])

如何python将字符串与列表连接起来?

删除 .split() 看看会发生什么。

os.path.join 仅接受字符串,并且您将列表作为第二个参数传递。例如。让我们假设您的 newfolder 看起来像这样:['folder1', 'folder2', 'etc'],您对该函数的调用像这样:

>>> os.path.join(folderdir, ['folder1', 'folder2', 'etc'])
# error

相反,您只需传递字符串,例如:

os.path.join(folderdir, 'folder1', 'folder2', 'etc')
# 'folderdir/folder1/folder2/etc'

为此,您可以使用 splat 运算符来解压参数列表:

os.path.join(folderdir, *newfolder)
# 'folderdir/folder1/folder2/etc'

Update @Ann Zen 指出的另一个问题是 for 循环。每次迭代改变 created_folder 变量,仅在循环后使用。您需要从文件中读取所有文本(作为列表),然后在循环后使用 *newfolder.

将其加入路径
with open(clientnames, "r") as newfolder:
    newfolder = newfolder.read()
    newfolder = [t for t in newfolder.split(' ') if len(t)>0]
created_folder = os.path.join(folderdir, *newfolder)

更新 2 另一个问题是当您尝试在路径中创建多个嵌套文件夹时,例如在文件夹test2中创建文件夹test1,但文件夹test2尚不存在,因此需要先创建。 假设每个文件夹在文件 clientnames:

的另一行中命名
with open(clientnames, "r") as newfolder:
    folderpath = folderdir
    for line in newfolder.readlines():
        foldername = line.strip()
        folderpath = os.path.join(folderpath, foldername)
        os.mkdir(folderpath)

那么如果文件 clientnames 看起来像这样:

test1
test2
test3

它会先创建folderdir/test1,然后是folderdir/test1/test2,最后是folderdir/test1/test2/test3,所以不会抛出FileNotFoundError

更新3如果你想为来自clientnames的每一行文本创建文件夹,全部植根于folderdir根本就不要堆叠路径, 并为每一行创建一个新的。

with open(clientnames, "r") as newfolder:
    for line in newfolder.readlines():
        foldername = line.strip()
        folderpath = os.path.join(folderdir, foldername)
        os.mkdir(folderpath)