创建文件(如果不存在)


81

我正在尝试打开一个文件,如果该文件不存在,则需要创建该文件并将其打开以进行写入。到目前为止,我有:

#open file for reading
fn = input("Enter file to open: ")
fh = open(fn,'r')
# if file does not exist, create it
if (!fh) 
fh = open ( fh, "w")

错误消息说在线上有问题if(!fh)。我可以exist在Perl中使用like吗?


Answers:


66

如果您不需要原子性,则可以使用os模块:

import os

if not os.path.exists('/tmp/test'):
    os.mknod('/tmp/test')

更新

正如Cory Klein所提到的,在Mac OS上使用os.mknod()必须具有root权限,因此,如果您是Mac OS用户,则可以使用open()而不是os.mknod()。

import os

if not os.path.exists('/tmp/test'):
    with open('/tmp/test', 'w'): pass

2
macOS需要sudo特权才能运行mknod,因此除非使用来运行python脚本,否则这不太可能移植到Mac sudo
科里·克莱恩

3
这会在exists()和之间创建竞争条件open()
Yasushi Shoji

它如何创建竞争条件?在执行open()之前先对exist()进行测试。
openCivilisation

因为exists()open()是两个分开的调用,所以此解决方案不是原子的。从理论上讲,这两个函数调用之间会有一段时间,此时另一个程序也可能会检查文件的存在并在未找到文件的情况下创建文件。
克伦

1
它在Windows上不起作用,操作系统没有属性mknod。
Timo

46
'''
w  write mode
r  read mode
a  append mode

w+  create file if it doesn't exist and open it in (over)write mode
    [it overwrites the file if it already exists]
r+  open an existing file in read+write mode
a+  create file if it doesn't exist and open it in append mode
'''

例:

file_name = 'my_file.txt'
f = open(file_name, 'a+')  # open file in append mode
f.write('python rules')
f.close()

我希望这有帮助。[仅供参考,使用python 3.6.2版]


6
r+不创建任何文件。同样在这里这里 提到的(在描述中)r+用于以读写模式打开文件。纠正它,因为它可能会使人们感到困惑:)
Stam Kaly

1
w+还清除文件的内容。是每种模式的完整(较长)描述。
约书亚

1
它在Windows上不起作用:发生了异常:FileNotFoundError
Eric Bellet

37

好吧,首先,在Python中没有!运算符,那就是not。但open也不会默默地失败-它将引发异常。并且需要适当地缩进块-Python使用空格指示块包含。

这样我们得到:

fn = input('Enter file name: ')
try:
    file = open(fn, 'r')
except IOError:
    file = open(fn, 'w')

1
我一直在试图弄清楚为什么它比它更好open(fn, 'a').close()。是因为seekappend中的隐式可能太昂贵了?
kojiro

13

这是一个快速的两层代码,如果文件不存在,我可以使用它来快速创建文件。

if not os.path.exists(filename):
    open(filename, 'w').close()

2
简短明了。请删除“文件名”周围的双引号。
rborodinov

12

使用input()隐含Python 3,最新的Python 3版本已IOError弃用该异常(现在是的别名OSError)。因此,假设您使用的是Python 3.3或更高版本:

fn = input('Enter file name: ')
try:
    file = open(fn, 'r')
except FileNotFoundError:
    file = open(fn, 'w')

8

我认为这应该工作:

#open file for reading
fn = input("Enter file to open: ")
try:
    fh = open(fn,'r')
except:
# if file does not exist, create it
    fh = open(fn,'w')

另外,fh = open ( fh, "w")当您要打开的文件是fn


9
您假设该文件不存在,因此无法打开。可能是您没有读取权限,或者文件名在某种程度上无效。裸except不是一个好主意。
cdarke

我知道(现在),但这对于他的编程水平已经足够有效,这不像我们在教他编程的礼节或为他做准备class
随机擦洗

8
好吧,那个可怜的家伙来自Perl,所以他需要他所能获得的所有帮助。
cdarke

这让我很快乐。我们可以解释这些错综复杂的内容,但是,我想睡觉,也许我会在早上向他解释他的行径,还是您想要?
随机擦洗

您无需撰写有关有效异常处理的论文,只需给他提供很好的例子。还有其他答案可以做到这一点。
乔纳森·莱因哈特

3

请注意,每次使用此方法打开文件时,文件中的旧数据都会被破坏,无论'w +'还是只是'w'。

import os

with open("file.txt", 'w+') as f:
    f.write("file is opened for business")

1
代码中有错别字。应该是with open('file.txt', 'w+') as f:
Flux

@Flux固定错字
Brimstedt

0

首先让我提到,您可能不希望创建一个文件对象,该文件对象最终可以打开以进行读取或写入,这取决于不可复制的条件。您需要知道可以使用,读取或写入哪些方法,这取决于您要对文件对象执行的操作。

就是说,您可以按照try One ...所建议的方法进行操作,除了try:...。实际上,这是建议的方法,根据python的座右铭“请求宽恕比允许容易”。

但是您也可以轻松地测试是否存在:

import os
# open file for reading
fn = raw_input("Enter file to open: ")
if os.path.exists(fn):
    fh = open(fn, "r")
else:
    fh = open(fn, "w")

注意:请使用raw_input()而不是input(),因为input()会尝试执行输入的文本。如果您不小心要测试文件“导入”,则会收到SyntaxError。


1
有关input()raw_input() 仅适用于Python 2的注释。Python 3已替换raw_input()input(),而“”的“旧”用法input()已消失。
cdarke '18

这是有可能的,并且将使其变得更直观是一个很好的改进。
Michael S.

0

从Python 3.4开始,pathlib除了许多其他系统调用功能之外,如果文件不存在,您可以使用内置库来创建文件。

from pathlib import Path

fn = input("Enter file to open: ")

Path(fn).touch() # File is only created if it doesn't exist (similar to touch command)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.