我正在尝试制作一个pygame可执行文件。我将使用以下安装文件:
from distutils.core import setup
import py2exe
setup(
console = [ "game.py" ],
author = "me",
data_files = [ ( directory, [ file_1, file_2... ] ) ]
)
我已经让这个在一个简单的游戏上工作得很好,但我要打包的游戏有> 700个图像文件。我的问题是,是否有一种简单的方法可以从目录中读取所有文件名,所以我不必单独列出每个文件名?
虽然有些文件按顺序编号,但大多数都有不同的根名称,因此编写一个产生相应字符串的循环不是一种选择。
由于
答案 0 :(得分:6)
import os
data_files = [(x[0], x[2]) for x in os.walk(root_dir)]
http://docs.python.org/library/os.html#os.walk
这将为root_dir
中包含的每个子目录(以及root_dir
本身中包含的子目录)提供格式为[(dirpath1, [file1, file2, ...]), (dirpath2, [file3, file4, ...]), ...]
我给了你这个作为我的答案,因为我假设(或者更确切地说,希望)有这么多文件,你要保持它们正确组织,而不是将它们全部放在没有子目录的单个目录中。
已经有一段时间了,但回过头来看,我现在意识到,对于很长的文件列表,生成器表达式可能会更高效。要做到这一点,需要进行非常简单的改变;用括号替换外括号,即
import os
data_file_gen = ((x[0], x[2]) for x in os.walk(root_dir))
然后可以在data_file_gen
迭代的地方使用data_files
(假设您只使用一次生成器;如果要多次使用生成器,则必须重新创建生成器在这种情况下,除非内存确实成为问题,否则最好只使用list方法。)。
答案 1 :(得分:4)
试试这个
data_files = [directory, ...] # whatever you want to put specifically.
data_files += [file for file in os.listdir('images') if os.path.isfile(file)] # for adding your image files
答案 2 :(得分:4)
os
模块有一个名为listdir
的方法,它采用路径并将内容作为列表返回。
答案 3 :(得分:1)
使用glob收集目录中的所有文件。使用。收集所有文件,或使用* .jpg收集所有.jpg文件。这会将图像放在py2exe输出目录中名为“Images”的文件夹中。
...
from glob import glob
...
data_files = [
("Stuff", glob(r'C:\projectfolder\Stuff\*.*'))
,("dlls", glob(r'C:\projectfolder\dlls\*.dll'))
,("Images", glob(r'C:\projectfolder\images\*.*'))
]
...
setup(
name='ProjectName'
,options = options
,data_files=data_files
,console=['projectname.py']
)