如何在运行.py脚本的目录中创建文件?

3

我正在尝试在运行 .py 脚本的文件夹中创建一个文件。这是我使用的代码。问题在于 open 函数需要 / 作为目录分隔符,而 new_file_path 使用的是 \。这导致 open 函数失败。我该如何解决?

import os

dir_path = os.path.dirname(os.path.realpath(__file__))
new_file_path = str(os.path.join(dir_path, 'mynewfile.txt'))
open(new_file_path, "x") 

请勿对os.path.join()的结果使用str()函数,同时将您得到的完整回溯信息贴出。在路径中使用正斜杠不会有问题。 - buran
不需要那么麻烦...默认值将是当前工作目录,因此简单的 open('mynewfile.txt', 'w') 就可以完成任务... - Tomerikoo
3个回答

5
首先,正如@buran所评论的那样,没有必要使用“str”,以下内容就足够了:
new_file_path = os.path.join(dir_path, 'mynewfile.txt')

脚本所在的位置由__file__给出,而当前工作目录(通常是调用脚本的位置)由os.getcwd()给出。从问题的措辞中并不完全清楚哪一个是预期的,尽管它们通常相同。但在以下情况下不同:

C:\Booboo>python3 test\my_script.py

但是它们处于以下情况:

C:\Booboo>python3 my_script.py

但是,如果你试图在当前工作目录中打开一个文件,为什么还需要调用os.getcwd()函数呢?不指定任何目录直接打开文件应该默认将其放置在当前工作目录:

import os

with open('mynewfile.txt', "x") as f:
    # do something with file f (it will be closed for you automatically when the block terminates

另一个问题可能是你使用了无效的标志打开文件,如果文件已经存在,则使用"x"。尝试使用"w"

with open(new_file_path, "w") as f:
    # do something with file f (it will be closed for you automatically when the block terminates

如果你从另一个目录调用脚本会怎样呢?它会在另一个目录中创建文件,而不是脚本所在的目录 - 这可能是一个原因。 - undefined
@Levon 你的评论是回答哪个问题的? - undefined
我本意是指这个。"在不指定任何目录的情况下打开文件,根据定义应该将文件放置在当前工作目录中:"我正在我的主目录(假设为/home/levon)中启动一个Python脚本,而这个脚本是从其他目录(/root)中启动的。该脚本正在创建一个日志文件open('logfile.txt', a),但是它并没有在脚本所在的/home/levon目录中创建,而是在/root目录中创建了该文件。 - undefined
@Levon 我完全同意你的观点,在我的帖子中没有任何与此相矛盾的内容(或者提出问题)。我说的是,“...和当前工作目录(通常是脚本被调用的位置),由os.getcwd()给出。”我是说默认情况下(除非你改变它),当前工作目录是脚本被调用的目录。在你的例子中,那将是/root。我有什么遗漏吗? - undefined

1
你尝试过简单地做吗?
import os

dir_path = os.getcwd()
open(dir_path +'mynewfile.txt', "x")

编辑:抱歉上一条消息保存不完整


抱歉,出现了发送问题。请使用当前代码重试。 - Roni Antonio
首先,你需要 dir_path + os.path.sep + 'mynewfile1.txt',否则这个 open 甚至无法成功。其次,默认情况下,如果你没有指定一个目录,系统会尝试在当前工作目录中打开文件(这就是当前工作目录的 定义),所以使用 os.getcwd() 完全是不必要的。怎么可能 这个 被接受为答案呢? - Booboo
你好兄弟。os.getcwd()返回一个字符串,其中包含调用Python脚本的当前路径。使用简单的字符串连接,他成功地使用了函数open(当前路径加上文件名)。干杯! - Roni Antonio
那么他必须一直在根目录/中。在任何其他目录中,例如/home/Ronigetcwd()将只返回/home/Roni而没有尾部路径分隔符,并且您的代码在一般情况下不起作用(如果您在根目录中盲目添加路径分隔符也不起作用)。这就是为什么您会想要使用os.path.join,它将适用于两种情况。因此,我的评论基于您的答案作为“通用解决方案”。我的另一个观点是调用getcwd()完全是不必要的。只需open('mynewfile.txt','x')即可。 - Booboo
那就是,如果你想要在当前工作目录中打开,这个目录可以与脚本文件所在的目录相同,但不一定相同。从OP的问题中并不完全清楚(至少对我来说),他真正想要哪一个,因为他的尝试使用了__file__,它是文件所在的位置,但他喜欢你的getcwd(),它是当前工作目录,而且,它们可能并不总是相同的 - Booboo

0

你需要使用os.getcwd来获取当前工作目录。

import os

dir_path = os.getcwd()
new_file_path = str(os.path.join(dir_path, 'mynewfile.txt'))
open(new_file_path, "x")

如果你只是执行了open('mynewfile.txt', 'x'),如果不是当前工作目录,那么它会进入哪个目录? - Booboo
谁知道呢? :/ -(' ')/- - sahasrara62
当前工作目录。换句话说,没有理由调用 os.getcwd() 将文件放入当前工作目录。 - Booboo
你的解决方案得到了A+,恭喜! - sahasrara62

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接