Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
防止我的文件被覆盖-python_Python - Fatal编程技术网

防止我的文件被覆盖-python

防止我的文件被覆盖-python,python,Python,我目前正在使用simple方法在应用程序运行时创建一个文件 file = open('myfile.dat', 'w+') 但是我注意到每次运行时都会覆盖文件,我想做的是,如果它已经存在,创建一个名为myfilex.dat的新文件,其中x是文件以前的副本数,有没有快速有效的方法 谢谢:) 编辑:我知道如何使用os.path.exists函数检查它是否已经存在,但我想问的是它是否确实存在。如果有意义,我如何简单地计算版本数。如果没有,对不起。你可以做两件事,要么用append打开,即file=O

我目前正在使用simple方法在应用程序运行时创建一个文件

file = open('myfile.dat', 'w+')
但是我注意到每次运行时都会覆盖文件,我想做的是,如果它已经存在,创建一个名为myfilex.dat的新文件,其中x是文件以前的副本数,有没有快速有效的方法

谢谢:)


编辑:我知道如何使用os.path.exists函数检查它是否已经存在,但我想问的是它是否确实存在。如果有意义,我如何简单地计算版本数。如果没有,对不起。你可以做两件事,要么用append打开,即
file=Open('myfile.dat','a')
或检查文件是否存在,并为用户提供覆盖选项。Python有许多选项。你可以查一下这个问题,看看有没有启发

检查一下你的文件是否已经存在

name = "myfile"
extension =".dat"
x = 0
fileName = name + extension
while(!os.path.exists(fileName)):
    x = x + 1
    fileName = name + x + extension
file = open(fileName, 'w+')

您可以使用时间戳,以便每次执行程序时,它都会写入不同的文件:

import time
file = open('myfile.%d.dat' % time.time(), 'w+')

没有什么特别快,但有效?当然我习惯了备份系统,我会:

filename.ext
filename-1.ext # older
filename-2.ext # older still
filename-3.ext # even older
这比你想做的稍微难一点。您希望
filename-N.ext
成为最新的文件!让我们使用
glob
查看有多少文件与该名称匹配,然后创建一个新文件

from glob import glob
import os.path

num_files = len(glob.glob(os.path.join(root, head, filename + "*", ext)))
# where:
#   root = r"C:\"
#   head = r"users\username\My Documents"
#   filename = "myfile"
#   ext = "dat"

if num_files = 0:
    num_files = "" # handles the case where file doesn't exist AT ALL yet

with open(os.path.join(root, head, filename + str(num_files), ext), 'w+'):
    do_stuff_to_file()
考虑

import os

def build_filename(name, num=0):
    root, ext = os.path.splitext(name)
    return '%s%d%s' % (root, num, ext) if num else name

def find_next_filename(name, max_tries=20):
    if not os.path.exists(name): return name
    else:
        for i in range(max_tries):
            test_name = build_filename(name, i+1)
            if not os.path.exists(test_name): return test_name
        return None
如果您的文件名不存在,它将返回您的文件名

如果您的文件名确实存在,它将尝试
rootX.extension
,其中
root
extension
由确定,并且
X
是一个整数,从1开始到
max\u trys
(我将其默认值设置为20,但您可以更改默认值或传递不同的参数)

如果找不到文件,函数将返回
None

注意,这里仍然存在争用条件(检查后,另一个进程创建了一个名称冲突的文件),但这正是您所说的

# When the files doesn't exist
print find_next_filename('myfile.dat')  # myfile.dat

# When the file does exist
print find_next_filename('myfile.dat')  # myfile1.dat

# When the file does exist, as does "1" and "2"
print find_next_filename('myfile.dat')  # myfile3.dat

那么,为什么不检查一下文件是否已经存在呢?我希望编辑得更清楚一点,我可以检查文件是否存在,但我正在尝试附加已经存在的副本数可能是