使用/ python从目录中读取文件名

时间:2011-07-13 16:30:01

标签: python filenames pygame py2exe distutils

我正在尝试制作一个pygame可执行文件。我将使用以下安装文件:

from distutils.core import setup
import py2exe

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

我已经让这个在一个简单的游戏上工作得很好,但我要打包的游戏有> 700个图像文件。我的问题是,是否有一种简单的方法可以从目录中读取所有文件名,所以我不必单独列出每个文件名?

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

由于

4 个答案:

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