如何从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)
挑战在于从文本文件中获取名称并在不同目录中创建新文件夹。我的问题是,当我尝试这样做时,它提到
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)