читать имена файлов из каталога с Python - PullRequest
3 голосов
/ 13 июля 2011

Я пытаюсь сделать исполняемый файл Pygame. Я буду использовать следующий установочный файл:

from distutils.core import setup
import py2exe

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

Я отлично справился с этой задачей в простой игре, но игра, которую я хочу упаковать, содержит> 700 файлов изображений. У меня вопрос: есть ли простой способ прочитать все имена файлов из каталога, чтобы мне не приходилось перечислять каждое из них отдельно?

Хотя некоторые файлы имеют последовательную нумерацию, у большинства есть другое корневое имя, поэтому написание цикла, который создает соответствующие строки, не вариант.

Спасибо

Ответы [ 4 ]

6 голосов
/ 13 июля 2011
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, если только память не станет проблемой.).

4 голосов
/ 13 июля 2011

Модуль os имеет метод с именем listdir, который принимает путь и возвращает содержимое в виде списка.

4 голосов
/ 13 июля 2011

Попробуйте это

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
1 голос
/ 27 июля 2011

Используйте 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']
)
...