Python 在执行过程中更新和保存

Python Update and Save During Execution

提问人:brett 提问时间:1/1/2014 更新时间:1/3/2014 访问量:959

问:

我不确定如何表达这个问题的标题。

Python 中是否有一种方法可以从终端获取输入并将该输入写入脚本并保存该更改?换句话说,脚本将是自我更新的。用户在提示符下输入一些字符序列,脚本会将这些字符写入脚本正文中。下次执行脚本时,这些字符将可供参考。

Python 自我更新

评论


答:

3赞 Martijn Pieters 1/1/2014 #1

您可以重写源文件,是的。它只是一个文件,在 Python 中读取和写入文件是完全可行的。Python 只加载一次源文件,因此重写它们当然是可能的。

但是,如果只使用一个单独的文件来编写序列,然后在下次运行代码时从该文件中读回序列,那就容易多了。

Python 具有任意数量的数据持久性模块,可以帮助更轻松地读取和写入文件中的序列。或者,您可以重复使用数据序列化标准(如 JSON)来为您处理读取和写入。这些将更容易维护。

评论

0赞 brett 1/1/2014
那么在脚本执行过程中,脚本可以修改并保存自己吗?这是如何做到的?我真的需要在脚本中进行此更改,而不是依赖单独的文件。
0赞 Martijn Pieters 1/1/2014
@brett:是源文件的文件名或字节缓存;您可以使用此全局查找原始源文件并将其读入脚本。Python 在首次导入文件时(在主脚本启动时)读取文件一次,因此您可以为下次启动 Python 编写新版本。__file__
0赞 Martijn Pieters 1/1/2014
@brett:但是为什么需要在剧本中进行更改呢?您的用例是什么?
0赞 brett 1/1/2014
该脚本提示用户输入用户定义的文件名并创建该文件。下次用户执行时,脚本应查找唯一文件(存在),如果为 true,则继续,如果没有,则提示用户将脚本指向该文件或创建新文件。因此,如果将原始文件名写入脚本,那就太好了。
0赞 Martijn Pieters 1/1/2014
@brett:你不能用文件名写一个单独的文件吗?该单独的文件将具有已知的文件名,在脚本中进行了硬编码。例如,您可以使用它来获取脚本当前所在的目录路径,并使用它来获取脚本旁边的新文件的绝对路径:并在其中写入数据。os.path.dirname(os.path.abspath(__file__))filename_file = os.path.join(current_directory, '.secret_filename_file.txt')
0赞 brett 1/3/2014 #2

以下脚本从第 2 行和第 3 行开始,不包含任何文件名 -

#! /usr/bin/env python3
#
#
import os.path
no_file_1, no_file_2 = False, False
#open the file containing this script and read, by line, into list 'a', close this file
thisfile = open('__file__','r')
a = []
while True:
    file_line = thisfile.readline()
    if not file_line:
        break
    else:
        a.append(file_line)
thisfile.close()
#extract the file names from line 2 and 3 of this file (one file name per line)
file_1, file_2 = a [1], a [2]
file_1, file_2 = file_1[1:-1], file_2[1:-1]
#if there are no file(s) listed in line 2 and 3, prompt the user for file name(s)
#and write the file name(s) w/ extenstion '.txt' to a[1] and a[2]
if file_1 == '':
    no_file_1 = True
if file_2 == '':
    no_file_2 = True
if no_file_1:
    file_1 = input('Enter 1st File Name (no extension) >>> ')
    a [1] = '#' + file_1 + '.txt' + '\n'
if no_file_2:
    file_2 = input('Enter 2nd File Name (no extension) >>> ')
    a [2] = '#' + file_2 + '.txt' + '\n'
#... then write a[new script] to this script
if no_file_1 or no_file_2:
    thisfile = open(__file__, 'w')
    for i in a:
        thisfile.write(i)
#now that this script contains file names in lines 2 and 3, check to see if they exist
#in the same directory as this script ... if not, create them.
file_1, file_2 = a [1], a [2]
file_1, file_2 = file_1[1:-1], file_2[1:-1]
if not os.path.exists(file_1):
    open(file_1, 'w')
    #write to file_1.txt
if not os.path.exists(file_2):
    open(file_2, 'w')
thisfile.close()
print(file_1,file_2)

执行脚本,检查并发现第 2 行和第 3 行中没有文件名。用户输入两个文件名,脚本使用正确的文件名覆盖自身,检查这两个文件是否存在,如果不存在,则脚本创建它们。

Enter 1st File Name (no extension) >>> file_1
Enter 2nd File Name (no extension) >>> file_2

下次执行脚本时,将在第 2 行和第 3 行中定义文件名,脚本会检查它们是否存在,如果不存在,则脚本将创建它们。

#! /usr/bin/env python3
#file_1.txt
#file_2.txt
import os.path
no_file_1, no_file_2 = False, False
#open the file containing this script and read, by line, into list 'a', close this file
thisfile = open(__file__,'r')
a = []
while True:
    file_line = thisfile.readline()
    if not file_line:
        break
    else:
        a.append(file_line)
thisfile.close()
#extract the file names from line 2 and 3 of this file (one file name per line)
file_1, file_2 = a [1], a [2]
file_1, file_2 = file_1[1:-1], file_2[1:-1]
#if there are no file(s) listed in line 2 and 3, prompt the user for file name(s)
#and write the file name(s) w/ extenstion '.txt' to a[1] and a[2]
if file_1 == '':
    no_file_1 = True
if file_2 == '':
    no_file_2 = True
if no_file_1:
    file_1 = input('Enter 1st File Name (no extension) >>> ')
    a [1] = '#' + file_1 + '.txt' + '\n'
if no_file_2:
    file_2 = input('Enter 2nd File Name (no extension) >>> ')
    a [2] = '#' + file_2 + '.txt' + '\n'
#... then write a[new script] to this script
if no_file_1 or no_file_2:
    thisfile = open(__file__, 'w')
    for i in a:
        thisfile.write(i)
#now that this script contains file names in lines 2 and 3, check to see if they exist
#in the same directory as this script ... if not, create them.
file_1, file_2 = a [1], a [2]
file_1, file_2 = file_1[1:-1], file_2[1:-1]
if not os.path.exists(file_1):
    open(file_1, 'w')
    #write to file_1.txt
if not os.path.exists(file_2):
    open(file_2, 'w')
thisfile.close()
print(file_1,file_2)