Add input from one python file to specific line in another python file
我有一个脚本(我们称之为脚本1),它在运行时请求键入一个名称(一次只能输入一个名称,因此您必须再次运行该脚本以添加另一个名称)
1 2
| name = input('
Please enter your name:') |
在另一个脚本(我们称之为脚本2)中,我必须按顺序手动键入这些名称
1
| names = ['None', 'Name1', 'Name2', 'Name3'] |
号
这是脚本2中54行中的第13行
是否可以自动将脚本1中键入的名称(运行脚本1后)添加到脚本2第13行的名称列表中?例如,假设我运行脚本1,当它提示我输入名称时,我输入名称john。如何让脚本自动将"john"(不带"")添加到脚本2中的名称列表中?
- 是否确实要script1修改script2?这通常是个很坏的主意。更好的解决方案包括将两者集成在一起,以便script1将script2作为模块导入,并将值传递到某个函数中,或者将数据存储在配置文件中,而不是在源文件中进行硬编码。
- 我认为您可能希望在这里使用一个简单的文本文件(每行一个名称),脚本1附加到,脚本2读取,我可以写一个答案,显示如何做,如果您给我们一个精简版本的脚本1和脚本编辑成问题。如果这不是你想要的,可以解释为什么。
- 谢谢你的文本文件建议,它工作得很好。我现在的问题是,我不知道如何获取脚本2中的"名称"列表,以便使用文本文件中的名称构建它的列表。这行吗?
- 是的,虽然with open(filename) as f: lines = list(f)有点好。(with确保立即关闭文件,而不是让它一直保持打开状态。)
如果确实要编辑script2的源代码,可以通过普通的字符串方法或regex,或者更好的方法,标记化或解析文件来完成。但实际上,你几乎肯定不想这样做。
如果您希望在程序运行期间使用某种持久性存储,则可能需要一个单独的文件。对于复杂的情况,您可能希望使用像dbm或sqlite3这样的数据库,但是这里,您只有一个名称列表,因此您可能可以将它们每行存储在一个简单的文本文件中。
有两个棘手的部分,但都非常简单:
- 如果你从未运行过script1,那么现在还没有文件。所以你要处理这个案子。
- 您需要确保在每个名称后面写新行('
'),然后在另一端去掉新行。
脚本1.py:
1 2 3 4 5
| name = input('
Please enter your name:')
with open('names.txt', 'w') as f:
f.write(name + '
') |
脚本2.py:
1 2 3 4 5
| try:
with open('names.txt') as f:
names = [line.rstrip() for line in f]
except FileNotFoundError:
names = [] |
号
如果你想在调用script1之前就有一个有效的名字的"起始列表",你可以添加一个names = ['Name1', 'Name2'] line about theopendocx1〔5〕names=[…]tonames.extend(…)`。但听起来你不想这样做,所以我让它从一个空列表开始,唯一的名称是你添加到文本文件中的名称。
还有一件事:在当前工作目录中查找names.txt。因此,如果从其他目录运行脚本,它将找不到该文件。如果你想在一个特定的地方找到它,比如/Users/Pergamon256/.config/my-app/names.txt,那就很容易了。如果你想"我的操作系统在哪里都是正常的地方",那就有点棘手了;Pypi上有库可以为你做这些。如果您想要脚本所在的同一个目录,那么上面有一些很好的答案,以展示如何做到这一点。
- 但是我该如何得到它,这样我就不必手动列出名字了?我希望列表从文本文件中逐行提取名称,并使用它们来创建列表。我不希望每次都输入名称1、名称2、名称3、名称4等,并且手动更新列表。
- @Pergamon256我以为你想在第一次运行脚本1之前就有一个"开始列表"。如果你不想要,我会编辑答案。
- 是的,我希望列表完全依赖于文本文件中的名称,不需要在脚本2中手动键入任何名称。
- @Pergamon256好,已编辑。