Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.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,我想从文件中读取数据而不截断它。 我知道我可以用“r”来阅读 但是,如果引发FileNotFoundError,我还希望创建该文件 但使用“w”、“w+”和“a+”创建文件是可行的,它还会在以后的运行中截断文件中的任何现有数据 基本上是在寻找以下产品的替代品: try: with open('filename', 'r') as file: #if no error is raised, file already exits and #can be rea

我想从文件中读取数据而不截断它。 我知道我可以用“r”来阅读

但是,如果引发FileNotFoundError,我还希望创建该文件

但使用“w”、“w+”和“a+”创建文件是可行的,它还会在以后的运行中截断文件中的任何现有数据

基本上是在寻找以下产品的替代品:

try:
    with open('filename', 'r') as file:
        #if no error is raised, file already exits and
        #can be read from: do stuff on file.
except FileNotFoundError:    
    with open('filename', 'x') as file:
        pass
        #no further actions are required here as the file 
        #is just being created
答复:

声明我应该以“rb+”模式打开文件,但是“rb+”会引发FileNotFoundError,如果文件不存在,则不会创建该文件


以二进制模式打开文件也不适合读取文本文件。

您可以使用
os.path.exists()
来代替
FileNotFoundError
的使用

import os


path = '/tmp/test.info'

if os.path.exists(path):
    with open(path, 'r') as infile:
        print(infile.read())
else:
    open(path, 'x')
如果您使用的是Python 3.4+,那么还可以用
pathlib
替换所有
os
用法

from pathlib import Path


path = Path('/tmp/test.info')

if path.is_file():
    print(path.read_text())
else:
    path.touch()

不过,我不确定这两种方法是否有很大的改进。如果您希望简洁,这些命令可以简化为一行或两行,但它们的可读性较差,仍然不是单个命令。

您可以尝试以下方法:

>>> try:
...   t = open('filename', 'r+')
... except FileNotFoundError:
...   t = open('filename', 'x')
...
>>> with t as file:
...   file.write("Testing:\n")
...
9

open()

file = open(file_name, 'a+')
file.seek(0)

a+是一种读/写模式,它不会截断文件,但会在文件末尾开始读取;这就是为什么以后需要查找文件的开头。

您不应该改用
try/except
吗,因为在
if
语句和实际打开/读取/写入文件之间,文件存在的状态可能会发生变化?如果您要做出这样的假设,在尝试打开(路径“x”)
时,还需要使用另一个
try/except
块,如果文件确实存在,它会抛出
fileexisterror
pathlib
没有这个问题,但这仍然不是我认为重要的问题,除非您所在的系统期望与来自多个源的相同文件进行大量的文件系统交互,在这种情况下,应该在问题中提到它。我如何在with语句中使用变量名?在REPL中具体是如何使用的<代码>将我的\u打开\u结果作为文件: