Where to put large Python lists

冷暖自知 提交于 2021-02-11 15:57:38

问题


I'm writing a python program that uses a list of all of the words in an English dictionary, so we're talking a few megabytes. I would like a clean way of including the list as a constant without it getting in the way of the source code. I would put it in a JSON file or something, but I'm using PySimpleGUI, and I want to take advantage of its ability to turn the code into a Windows EXE file, and I doubt it could do that with an external text file.

So, in order of preference I would like to do one of the following:

  1. Have it in an external text file if PySimpleGui's exe-maker can support that.
  2. Have it in another python script and import it.
  3. Have it in the original python script, but declare it at the top but actually fill it up at the bottom where it won't get in the way of seeing the source code.
  4. Declare it with values and all at the top of the source file, and just scroll down to the bottom whenever I look at the source code.

What's the best way to tackle this? Is there a clever way that I am missing?


回答1:


I personally think having the data in a separate file is the cleanest way. You could for example just create a csv or json or simple text file from another application and just place it in the right directory.

It seems, that pysimpleGUI does not create executables by itself, it seems to be using pyinstaller ( https://pysimplegui.readthedocs.io/en/latest/#creating-a-windows-exe-file )

Pyinstaller allows to add non python files (like for example in your case json or csv files) to its executable.

When the executable is started a temporary directory is created and all the python and the added files will be extracted and stored there.

You have to use the switch --add-data *source_path*:**destination_path**

Below example shows how to do this.

just create in the directory where your python script is installed a directory named files and place your datafiles you want to be bundled with your application inside it.

For this example this will be one file named files/info.csv

For this example to work it should contain at least one line.

Then create your python file (for this test with following contents)

example filename: 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()

and type following command to create the executable:

pyinstaller -wF sg_w_fread.py --add-data files:files


来源:https://stackoverflow.com/questions/62052922/where-to-put-large-python-lists

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!