2011-07-13 64 views
3

我正在尝试创建一个pygame可执行文件。我将使用以下安装文件:从目录w/python读取文件名

from distutils.core import setup 
import py2exe 

setup( 
    console = [ "game.py" ], 
    author = "me", 
    data_files = [ (directory, [ file_1, file_2... ]) ] 
) 

我已经得到这一个简单的游戏做工精细,但这场比赛我要打包起来了> 700的图像文件。我的问题是,是否有一种简单的方法来读取目录中的所有文件名,所以我不必分别列出每个文件名?

尽管有一些文件按顺序编号,但大多数文件的根名称不同,因此编写一个使相应字符串不变的循环不是一种选择。

感谢

+0

这里'data_files = [(directory,[file_1,file_2 ...])',''似乎是额外的。请纠正它。 –

+0

已更正,谢谢 – sabajt

+0

对于此问题的任何其他人,[link](http://www.py2exe.org/index.cgi/data_files)也帮助我理解了安装脚本对data_files – sabajt

回答

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方法,除非内存确实成为问题)。

+0

工程就像一个魅力。感谢所有回答的人。 – sabajt

+0

你很受欢迎。 – JAB

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 
+0

的作用。 – sabajt

+1

为了达到这个目的,你需要包含os.path.isfile中列出的目录,假设它不是cwd。 'dir ='images'' 'data_files + = [文件在os.listdir(dir)中的文件如果os.path.isfile(dir +文件)]' –

4

os模块有一个名为listdir方法,它的路径,并作为一个列表返回的内容。

+0

并且这也起作用。 – sabajt

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'] 
)