【问题标题】:read file names from directory w/ python从带有python的目录中读取文件名
【发布时间】:2011-07-13 16:30:00
【问题描述】:

我正在尝试制作一个 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... ] ),[ 似乎是多余的。请更正。
  • 对于遇到此问题的其他人,link 还帮助我了解了安装脚本对 data_files 的作用

标签: python filenames pygame py2exe distutils


【解决方案1】:
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 方法,除非内存确实成为问题。)。

【讨论】:

  • 像魅力一样工作。感谢所有回答的人。
【解决方案2】:

试试这个

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

【讨论】:

  • 为此,您需要包含 os.path.isfile 中列出的目录,假设它不是 cwd。 dir = 'images'data_files += [file for file in os.listdir(dir) if os.path.isfile(dir + file)]
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 2010-10-11
      • 1970-01-01
      • 1970-01-01
      • 2019-11-13
      • 2016-12-27
      • 2014-11-10
      • 1970-01-01
      • 2016-02-03
      相关资源
      最近更新 更多