在哪里放置大型 Python 列表
Where to put large Python lists
我正在编写一个 python 程序,它使用英语词典中所有单词的列表,所以我们说的是几兆字节。我想要一种干净的方法来将列表作为常量包含在内,而不会妨碍源代码。我会把它放在 JSON 文件或其他文件中,但我使用的是 PySimpleGUI,我想利用它把代码转换成 Windows EXE 文件的能力,但我怀疑它能否使用外部文本文件执行此操作。
因此,按照优先顺序,我想执行以下操作之一:
- 如果 PySimpleGui 的 exe-maker 可以支持,请将它放在外部文本文件中。
- 将其放在另一个 python 脚本中并导入。
- 在原来的python脚本中有,但在顶部声明但实际上在底部填充它不会妨碍查看源代码。
- 在源文件的顶部用值和全部声明它,每当我查看源代码时,只需向下滚动到底部。
解决这个问题的最佳方法是什么?有没有我想念的聪明方法?
我个人认为将数据放在一个单独的文件中是最干净的方法。
例如,您可以从另一个应用程序创建一个 csv
或 json
或简单的文本文件,然后将其放在正确的目录中。
看来,pysimpleGUI 本身并不创建可执行文件,它似乎在使用 pyinstaller
( https://pysimplegui.readthedocs.io/en/latest/#creating-a-windows-exe-file )
Pyinstaller 允许将非 python 文件(例如您的 json 或 csv 文件)添加到其可执行文件中。
当可执行文件启动时,会创建一个临时目录,所有 python 和添加的文件都将被提取并存储在那里。
你必须使用开关
--add-data *source_path*:**destination_path**
下面的示例显示了如何执行此操作。
只需在安装 python 脚本的目录中创建一个名为 files
的目录,然后将要与应用程序捆绑在一起的数据文件放入其中。
对于此示例,这将是一个名为 files/info.csv
的文件
要使此示例正常工作,它应该至少包含一行。
然后创建您的 python 文件(针对此测试,内容如下)
示例文件名:sg_w_fread.py
import os
import sys
import PySimpleGUI as sg
if getattr(sys, "frozen", False):
# for executable mode
BASEDIR = sys._MEIPASS
else:
# for development mode
BASEDIR = os.path.dirname(os.path.realpath(__file__))
print("BASEDIR =", BASEDIR)
fname = os.path.join(BASEDIR, "files", "info.csv")
# just for debugging
print("FNAME", repr(fname))
print(os.path.isfile(fname))
sg.theme('DarkAmber') # Add a touch of color
# read something from a file
with open(fname) as fin:
txt = fin.read().split("\n")[0]
layout = [ [sg.Text("first line of file is '" + txt + "'")], # display something from the file
[sg.Text('Enter something on Row 2'), sg.InputText()],
[sg.Button('Ok'), sg.Button('Cancel')] ]
window = sg.Window('Window Title', layout)
while True:
event, values = window.read()
if event in (None, 'Cancel'): # if user closes window or clicks cancel
break
print('You entered ', values[0])
window.close()
并键入以下命令来创建可执行文件:
pyinstaller -wF sg_w_fread.py --add-data files:files
我正在编写一个 python 程序,它使用英语词典中所有单词的列表,所以我们说的是几兆字节。我想要一种干净的方法来将列表作为常量包含在内,而不会妨碍源代码。我会把它放在 JSON 文件或其他文件中,但我使用的是 PySimpleGUI,我想利用它把代码转换成 Windows EXE 文件的能力,但我怀疑它能否使用外部文本文件执行此操作。
因此,按照优先顺序,我想执行以下操作之一:
- 如果 PySimpleGui 的 exe-maker 可以支持,请将它放在外部文本文件中。
- 将其放在另一个 python 脚本中并导入。
- 在原来的python脚本中有,但在顶部声明但实际上在底部填充它不会妨碍查看源代码。
- 在源文件的顶部用值和全部声明它,每当我查看源代码时,只需向下滚动到底部。
解决这个问题的最佳方法是什么?有没有我想念的聪明方法?
我个人认为将数据放在一个单独的文件中是最干净的方法。
例如,您可以从另一个应用程序创建一个 csv
或 json
或简单的文本文件,然后将其放在正确的目录中。
看来,pysimpleGUI 本身并不创建可执行文件,它似乎在使用 pyinstaller
( https://pysimplegui.readthedocs.io/en/latest/#creating-a-windows-exe-file )
Pyinstaller 允许将非 python 文件(例如您的 json 或 csv 文件)添加到其可执行文件中。
当可执行文件启动时,会创建一个临时目录,所有 python 和添加的文件都将被提取并存储在那里。
你必须使用开关
--add-data *source_path*:**destination_path**
下面的示例显示了如何执行此操作。
只需在安装 python 脚本的目录中创建一个名为 files
的目录,然后将要与应用程序捆绑在一起的数据文件放入其中。
对于此示例,这将是一个名为 files/info.csv
要使此示例正常工作,它应该至少包含一行。
然后创建您的 python 文件(针对此测试,内容如下)
示例文件名:sg_w_fread.py
import os
import sys
import PySimpleGUI as sg
if getattr(sys, "frozen", False):
# for executable mode
BASEDIR = sys._MEIPASS
else:
# for development mode
BASEDIR = os.path.dirname(os.path.realpath(__file__))
print("BASEDIR =", BASEDIR)
fname = os.path.join(BASEDIR, "files", "info.csv")
# just for debugging
print("FNAME", repr(fname))
print(os.path.isfile(fname))
sg.theme('DarkAmber') # Add a touch of color
# read something from a file
with open(fname) as fin:
txt = fin.read().split("\n")[0]
layout = [ [sg.Text("first line of file is '" + txt + "'")], # display something from the file
[sg.Text('Enter something on Row 2'), sg.InputText()],
[sg.Button('Ok'), sg.Button('Cancel')] ]
window = sg.Window('Window Title', layout)
while True:
event, values = window.read()
if event in (None, 'Cancel'): # if user closes window or clicks cancel
break
print('You entered ', values[0])
window.close()
并键入以下命令来创建可执行文件:
pyinstaller -wF sg_w_fread.py --add-data files:files