【问题标题】:mkdir with subfolders working in terminal but not from python [duplicate]mkdir 子文件夹在终端中工作但不是来自 python [重复]
【发布时间】:2018-05-22 09:51:14
【问题描述】:

我想创建一些带有子文件夹的文件夹,并使用这个 python3 脚本来读取 csv 文件并为我创建目录。

from subprocess import call
import csv

def csv_dict_reader(file_obj):
    """
    Read a CSV file using csv.DictReader
    """
    reader = csv.DictReader(file_obj, delimiter=',')
    for line in reader:
        sanitized_name = line["course"].replace(" ", "-").lower()

        command = 'mkdir -p ' + sanitized_name + '/week_{1..'+ line["week"] +'}/{slides,exercise,assignment}'
        call(command)


if __name__ == "__main__":
    with open("courses.csv") as f_obj:
        csv_dict_reader(f_obj)

我期待它执行这种命令

mkdir -p algorithmic-toolbox/week_{1..6}/{slides,exercise,assignment}

在终端上运行良好,并创建一个名为 algorithmic-toolbox 的文件夹,其中包含来自 week1 to week6 的 6 个文件夹,然后每个文件夹都包含 slides, exercises and assignment 文件夹。

示例 csv 如下所示:

course,week
Algorithmic Toolbox,6
Data Structures,4
Algorithms on Graphs,5

我在运行 python 脚本时遇到此错误。

Traceback (most recent call last):
  File "course-folder.py", line 18, in <module>
    csv_dict_reader(f_obj)
  File "course-folder.py", line 13, in csv_dict_reader
    call(command)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/subprocess.py", line 267, in call
with Popen(*popenargs, **kwargs) as p:
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/subprocess.py", line 709, in __init__
restore_signals, start_new_session)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/subprocess.py", line 1344, in _execute_child
raise child_exception_type(errno_num, err_msg, err_filename)
FileNotFoundError: [Errno 2] No such file or directory: 'mkdir -p algorithmic-toolbox/week_{1..6}/{slides,exercise,assignment}': 'mkdir -p algorithmic-toolbox/week_{1..6}/{slides,exercise,assignment}'

不知道为什么当我使用-p 创建目录时它会显示FilenotFoundError,如果父目录不存在,则应该创建它们。

【问题讨论】:

  • 试试shell=True?
  • 为什么要调用 subprocess 而不是 os.makedirs(或 pathlib.Path.mkdir())?
  • 这是重复的,但要意识到我从来不知道要问什么实际问题(“参数扩展”可能是关键)。并使用 subprocess 只是因为它是我遇到的第一个解决方案。我不是python和shell方面的专家,我选择了第一种方便的方法,没有什么特别的原因

标签: python python-3.x mkdir


【解决方案1】:
mkdir -p algorithmic-toolbox/week_{1..6}/{slides,exercise,assignment}

如果不将shell=True 参数传递给subprocess.call,我相信上述命令中使用的参数扩展将不起作用。这样 Python 将在中间的 shell 进程中执行命令。

如果您希望脚本独立于平台,您可以改用 os.mkdir 并在 Python 中处理逻辑。

【讨论】:

    猜你喜欢
    • 2011-10-05
    • 2020-12-25
    • 1970-01-01
    • 2012-03-03
    • 2015-09-29
    • 1970-01-01
    • 1970-01-01
    • 2021-07-11
    • 2019-10-26
    相关资源
    最近更新 更多