python是否有结合了“w+”和“r”特性的文件打开模式?

python是否有结合了“w+”和“r”特性的文件打开模式?,python,python-3.x,file,file-read,Python,Python 3.x,File,File Read,我有一个脚本,用于从外部API请求数据。我的脚本包含复杂的逻辑,描述它需要很多时间。在脚本的某一点上,我需要打开一个文件,在其上循环并从中提取每个值 with open(os.path.abspath("/data/data/com.termux/files/home/storage/forecast/endpoints/leagueIdExtracted.txt"), "r+") as leagueIdExtracted: print("Check is file {} was ope

我有一个脚本,用于从外部API请求数据。我的脚本包含复杂的逻辑,描述它需要很多时间。在脚本的某一点上,我需要打开一个文件,在其上循环并从中提取每个值

with open(os.path.abspath("/data/data/com.termux/files/home/storage/forecast/endpoints/leagueIdExtracted.txt"), "r+") as leagueIdExtracted:
    print("Check is file {} was opened".format(leagueIdExtracted))                                                        
    for id in leagueIdExtracted:
        print("ID {} from opened file".format(id))                 
        savedLeagues.add(int(str(id[:-1])))                 
        print("League IDs {} from file which contain alredy requested IDs".format(savedLeagues))
但有时不是由我决定,我在上面打开的文件是不存在的

with open(os.path.abspath("/data/data/com.termux/files/home/storage/forecast/endpoints/leagueIdExtracted.txt"), "r+") as leagueIdExtracted:
因为它,当我打开这个文件时,我必须以w+模式打开它。在w+中打开它可以保证创建并打开一个不存在的文件。但是,当我的脚本以w+模式打开文件时,它无法从中提取值

for id in leagueIdExtracted:
    print("ID {} from opened file".format(id))                 
    savedLeagues.add(int(str(id[:-1])))
因此,我必须手动在w+和r模式之间切换。有人能告诉我Python是否有一种模式,如果它不以w+模式存在,并且允许以w+模式提取数据,那么它在打开文件时会创建文件 r模式

如果您的目标是读/写现有文件,则希望使用“r+”。如果您还想创建新文件,请使用“a+”。换句话说,您将能够完成以下三项

1. Create if file does not exist
2. Write (append) if file exists
3. Read in file
引述自:

“r”时,仅读取文件, 仅用于写入具有相同名称的现有文件的“w”将被擦除, “a”打开要追加的文件;写入文件的任何数据都会自动添加到末尾。 “r+”打开文件进行读取和写入。 如果您的目标是读/写现有文件,则需要使用“r+”。如果您还想创建新文件,请使用“a+”。换句话说,您将能够完成以下三项

1. Create if file does not exist
2. Write (append) if file exists
3. Read in file
引述自:

“r”时,仅读取文件, 仅用于写入具有相同名称的现有文件的“w”将被擦除, “a”打开要追加的文件;写入文件的任何数据都会自动添加到末尾。 “r+”打开文件进行读取和写入。 您可以使用+作为模式。使用+将打开一个文件进行追加和读取。如果文件不存在,将创建该文件

在本例中,sample.txt尚不存在 在opensample.txt中,a+作为f: 打印文件中的数据:,f.read f、 写了一行 打印关闭文件 在opensample.txt中,a+作为f: f、 seek0 打印文件中的新数据:,f.read 输出:

Data in the file:
Closed the file
New data in the file: wrote a line
您应该记住,在+模式下打开会将光标放在文件的末尾。因此,如果要从头开始读取数据,必须使用f.seek0将光标放置在文件的开头。

可以使用+作为模式。使用+将打开一个文件进行追加和读取。如果文件不存在,将创建该文件

在本例中,sample.txt尚不存在 在opensample.txt中,a+作为f: 打印文件中的数据:,f.read f、 写了一行 打印关闭文件 在opensample.txt中,a+作为f: f、 seek0 打印文件中的新数据:,f.read 输出:

Data in the file:
Closed the file
New data in the file: wrote a line

您应该记住,在+模式下打开会将光标放在文件的末尾。因此,如果要从头开始读取数据,必须使用f.seek0将光标放在文件的开头。

为什么不直接搜索文件的开头?@juanpa.arrivillaga你的意思是什么?啊,对不起,我忘了,w+正在截断文件,这就是问题所在,对吗?你为什么不直接查找文件的开头?@juanpa.arrivillaga你是什么意思?啊,对不起,我忘了,w+正在截断文件,这就是问题所在,对吗?如果文件不存在,r+将不会创建文件我尝试了r+模式,但它不能解决我的问题我只是检查了它这里是回溯:回溯最近的调用last:file,第1行,文件/data/data/com.termux/files/home/storage/predictions/forecast/team.py,第17行,与openos.path.abspath/data/data/com.termux/files/home/storage/forecast/endpoints/leagueIdExtracted.txt一起,r+作为leagueIdExtracted:FileNotFoundError:[Errno 2]没有这样的文件或目录:'/data/data/com.termux/files/home/storage/forecast/endpoints/leagueIdExtracted.txt'实际上,我错过了你问题的最后一部分。由于您需要创建或写入结尾追加,因此它必须是“a+”而不是“r+”。如果它不存在,r+将不会创建文件。我尝试了r+模式,但它没有解决我的问题。我只是检查了它,这里是回溯:回溯最近的调用last:file,第1行,在file/data/data/com.termux/files/home/storage/predictions/forecast/team.py中,第17行,在openos.path.abspath/data/data/com.termux/files/home/storage/forecast/endpoints/leagueIdExtracted.txt中,r+作为leagueIdExtracted:FileNotFoundError:[Errno 2]没有这样的文件或目录:'/data/data/com.termux/files/home/storage/forecast/endpoints/leagueIdExtracted.txt'实际上,我错过了你问题的最后一部分。由于您需要创建或写入结尾追加,因此它必须是“a+”而不是“r+”。我检查了您的建议。您是对的,一个+模式创建的文件不存在,但不允许循环并从中提取。试着复制我的剧本。我的答案的最后一部分解释了原因
发生。使用+时,光标将放置在文件的末尾。打开后立即尝试阅读不会给你带来任何好处。您必须使用f.seek0将光标移动到文件的开头感谢您的新知识。我检查过了,它工作正常。谢谢你的解决方案。我将标记你的答案为正确,如果你能投票支持我的问题,我检查了你的建议。您是对的,一个+模式创建的文件不存在,但不允许循环并从中提取。试着复制我的剧本。我的答案的最后一部分解释了为什么会发生这种情况。使用+时,光标将放置在文件的末尾。打开后立即尝试阅读不会给你带来任何好处。您必须使用f.seek0将光标移动到文件的开头感谢您的新知识。我检查过了,它工作正常。谢谢你的解决方案。我会把你的答案标记为正确,如果你能投票支持我的问题