使用Python从目录中读取文件名

5

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

from distutils.core import setup
import py2exe

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

我已经成功地在一个简单的游戏中使用了这个方法,但我想打包的游戏有超过700个图像文件。我的问题是,是否有一种简单的方法可以从目录中读取所有文件名,以便我不必单独列出每一个文件名?
虽然有一些文件是按顺序编号的,但大多数都有不同的根名称,因此编写一个生成适当字符串的循环不是一个选项。
谢谢。

这里,data_files = [ ( directory, [ file_1, file_2... ] ),似乎多了一个 [ 符号。请纠正它。 - Pushpak Dagade
对于任何遇到这个问题的人,链接也帮助我理解了安装脚本如何处理数据文件。 - sabajt
4个回答

7
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 的地方使用(假设您只使用生成器一次;如果生成器要多次使用,则必须为每个使用重新创建生成器。在这种情况下,除非内存确实成为问题,否则最好仅使用列表方法。)。


运行得非常好。感谢所有回答的人。 - sabajt

6

os 模块有一个叫做 listdir 的方法,它接收一个路径并将其内容返回为列表。


请注意,该列表未排序。可以使用“sorted”函数进行排序:https://docs.python.org/3/library/functions.html?highlight=sorted#sorted。 - Mitch

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
为了使其工作,您需要包含在os.path.isfile中列出的目录,假设它不是cwd。`dir ='images'` `data_files + = [file for file in os.listdir(dir) if os.path.isfile(dir + file)]` - Mike Shultz

1
使用glob来收集目录中的所有文件。使用 . 来收集所有文件,或使用* .jpg来收集所有.jpg文件。这将把图像放在名为“Images”的文件夹中,该文件夹位于您的py2exe输出目录中。
...
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']
)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接