python rinominare Come elenco tutti i file di una directory?




rinominare file python (24)

Come posso elencare tutti i file di una directory in Python e aggiungerli a una list ?


Un'altra variante molto leggibile per Python 3.4+ sta usando pathlib.Path.glob:

from pathlib import Path
folder = '/foo'
[f for f in Path(folder).glob('*') if f.is_file()]

È semplice rendere più specifici, ad esempio cercare solo i file di origine Python che non sono link simbolici, anche in tutte le sottodirectory:

[f for f in Path(folder).glob('**/*.py') if not f.is_symlink()]

Dovresti usare il modulo os per elencare il contenuto della directory. os.listdir(".") restituisce tutti i contenuti della directory. Ripetiamo il risultato e aggiungiamo alla lista.

import os

content_list = []

for content in os.listdir("."): # "." means current directory
    content_list.append(content)

print content_list

def list_files(path):
    # returns a list of names (with extension, without full path) of all files 
    # in folder path
    files = []
    for name in os.listdir(path):
        if os.path.isfile(os.path.join(path, name)):
            files.append(name)
    return files 

import dircache
list = dircache.listdir(pathname)
i = 0
check = len(list[0])
temp = []
count = len(list)
while count != 0:
  if len(list[i]) != check:
     temp.append(list[i-1])
     check = len(list[i])
  else:
    i = i + 1
    count = count - 1

print temp

Ottenere percorsi di file completi da una directory e da tutte le sue sottodirectory

import os

def get_filepaths(directory):
    """
    This function will generate the file names in a directory 
    tree by walking the tree either top-down or bottom-up. For each 
    directory in the tree rooted at directory top (including top itself), 
    it yields a 3-tuple (dirpath, dirnames, filenames).
    """
    file_paths = []  # List which will store all of the full filepaths.

    # Walk the tree.
    for root, directories, files in os.walk(directory):
        for filename in files:
            # Join the two strings in order to form the full filepath.
            filepath = os.path.join(root, filename)
            file_paths.append(filepath)  # Add it to the list.

    return file_paths  # Self-explanatory.

# Run the above function and store its results in a variable.   
full_file_paths = get_filepaths("/Users/johnny/Desktop/TEST")
  • Il percorso che ho fornito nella funzione precedente conteneva 3 file, due dei quali nella directory principale e un altro in una sottocartella chiamata "SUBFOLDER". Ora puoi fare cose come:
  • print full_file_paths che stamperà la lista:

    • ['/Users/johnny/Desktop/TEST/file1.txt', '/Users/johnny/Desktop/TEST/file2.txt', '/Users/johnny/Desktop/TEST/SUBFOLDER/file3.dat']

Se lo desideri, puoi aprire e leggere il contenuto oppure concentrarti solo sui file con estensione ".dat" come nel seguente codice:

for f in full_file_paths:
  if f.endswith(".dat"):
    print f

/Users/johnny/Desktop/TEST/SUBFOLDER/file3.dat


Utilizzare questa funzione se si desidera utilizzare un tipo di file diverso o ottenere la directory completa:

import os

def createList(foldername, fulldir = True, suffix=".jpg"):
    file_list_tmp = os.listdir(foldername)
    #print len(file_list_tmp)
    file_list = []
    if fulldir:
        for item in file_list_tmp:
            if item.endswith(suffix):
                file_list.append(os.path.join(foldername, item))
    else:
        for item in file_list_tmp:
            if item.endswith(suffix):
                file_list.append(item)
    return file_list

Mi è davvero piaciuta la risposta di adamk , suggerendo che tu usi glob() , dal modulo con lo stesso nome. Questo ti permette di avere pattern matching con * s.

Ma come hanno sottolineato altre persone nei commenti, glob() può essere inciampato in direzioni discordanti incoerenti. Per aiutarti, ti suggerisco di usare le funzioni join() ed expanduser() nel modulo os.path , e forse anche la funzione getcwd() nel modulo os .

Come esempi:

from glob import glob

# Return everything under C:\Users\admin that contains a folder called wlp.
glob('C:\Users\admin\*\wlp')

Quanto sopra è terribile: il percorso è stato hardcoded e funzionerà solo su Windows solo tra il nome del drive e i \ s che sono stati codificati nel percorso.

from glob    import glob
from os.path import join

# Return everything under Users, admin, that contains a folder called wlp.
glob(join('Users', 'admin', '*', 'wlp'))

Quanto sopra funziona meglio, ma si basa sul nome della cartella Users che si trova spesso su Windows e non così spesso trovato su altri sistemi operativi. Si basa anche sull'utente che ha un nome specifico, admin .

from glob    import glob
from os.path import expanduser, join

# Return everything under the user directory that contains a folder called wlp.
glob(join(expanduser('~'), '*', 'wlp'))

Funziona perfettamente su tutte le piattaforme.

Un altro grande esempio che funziona perfettamente su piattaforme e fa qualcosa di un po 'diverso:

from glob    import glob
from os      import getcwd
from os.path import join

# Return everything under the current directory that contains a folder called wlp.
glob(join(getcwd(), '*', 'wlp'))

Spero che questi esempi ti aiutino a vedere il potere di alcune delle funzioni che puoi trovare nei moduli standard della libreria Python.


import os 
os.listdir(path)

Ciò restituirà un elenco di tutti i file e le directory in path.

filenames = next(os.walk(path))[2]

Ciò restituirà solo un elenco di file, non di sottodirectory.


Seconda parte 1

Soluzioni (continua)

Altri approcci:

  1. Usa Python solo come wrapper

    • Tutto è fatto usando un'altra tecnologia
    • Questa tecnologia è invocata da Python
    • Il sapore più famoso che conosco è quello che io chiamo l' approccio dell'amministratore di sistema :

      • Usa Python (o qualsiasi linguaggio di programmazione per quella materia) per eseguire comandi di shell (e analizzare i loro output - in generale questo approccio deve essere evitato, poiché se alcuni formati di output dei comandi differiscono leggermente tra versioni / sapori del SO , il codice di analisi dovrebbe essere adattato, per non parlare di locali non EN )
      • Alcuni considerano questo un trucco pulito
      • Lo considero più una soluzione pessima ( gainarie ), poiché l'azione di per sé viene eseguita dalla shell ( cmd in questo caso), e quindi non ha nulla a che fare con Python .
      • Il filtraggio ( grep/ findstr) o la formattazione dell'output possono essere eseguiti su entrambi i lati, ma non ho intenzione di insistere su di esso. Inoltre, ho deliberatamente usato os.systeminvece di subprocess.Popen.
      (py35x64_test) E:\Work\Dev\\q003207219>"e:\Work\Dev\VEnvs\py35x64_test\Scripts\python.exe" -c "import os;os.system(\"dir /b root_dir\")"
      dir0
      dir1
      dir2
      dir3
      file0
      file1
      

Fine della seconda parte 1


1. A causa del fatto che il limite di post (domanda / risposta) di Home è di 30000 caratteri ( [SE.Meta]: Conoscere i tuoi limiti: qual è la lunghezza massima di un titolo di domanda, post, immagine e link utilizzati? ), la risposta è stata divisa in 2 parti. Per favore assicuratevi di leggere [SO]: Come faccio a elencare tutti i file di una directory? (@ Risposta di CristiFati - "Prima parte") precedente.


Versione davvero semplice:

import os
[f for f in os.listdir(os.getcwd) if ...]

import os
os.listdir("somedirectory")

restituirà un elenco di tutti i file e le directory in "somedirectory".


Fornirò un campione di un liner in cui l'origine e il tipo di file possono essere forniti come input. Il codice restituisce un elenco di nomi di file con estensione csv. Usa . nel caso in cui tutti i file devono essere restituiti. Questo scriverà anche in modo ricorsivo le sottodirectory.

[y for x in os.walk(sourcePath) for y in glob(os.path.join(x[0], '*.csv'))]

Modifica le estensioni di file e il percorso di origine secondo necessità.


Restituire un elenco di percorsi di file assoluti, non ricorre nelle sottodirectory

L = [os.path.join(os.getcwd(),f) for f in os.listdir('.') if os.path.isfile(os.path.join(os.getcwd(),f))]

import os
lst=os.listdir(path)

os.listdir restituisce una lista contenente i nomi delle voci nella directory data dal percorso.


os.listdir() ti porterà tutto ciò che è in una directory: file e directory.

Se vuoi solo i file, puoi filtrarli usando os.path :

from os import listdir
from os.path import isfile, join
onlyfiles = [f for f in listdir(mypath) if isfile(join(mypath, f))]

oppure potresti utilizzare os.walk() che genererà due elenchi per ogni directory os.walk() suddividendoli in file e directory per te. Se si desidera solo la directory principale, è possibile interrompere la prima volta

from os import walk

f = []
for (dirpath, dirnames, filenames) in walk(mypath):
    f.extend(filenames)
    break

Infine, come mostra l'esempio, aggiungendo una lista a un'altra è possibile utilizzare .extend() o

>>> q = [1, 2, 3]
>>> w = [4, 5, 6]
>>> q = q + w
>>> q
[1, 2, 3, 4, 5, 6]

Personalmente, preferisco .extend()


Esegui findfiles () con una directory come parametro e restituirà un elenco di tutti i file al suo interno.

import os
def findfiles(directory):
    objects = os.listdir(directory)  # find all objects in a dir

    files = []
    for i in objects:  # check if very object in the folder ...
        if os.path.isfile(os.path.join(directory, i)):  # ... is a file.
            files.append(i)  # if yes, append it.
    return files

Se stai cercando un'implementazione Python di find , questa è una ricetta che uso piuttosto frequentemente:

from findtools.find_files import (find_files, Match)

# Recursively find all *.sh files in **/usr/bin**
sh_files_pattern = Match(filetype='f', name='*.sh')
found_files = find_files(path='/usr/bin', match=sh_files_pattern)

for found_file in found_files:
    print found_file

Quindi ho creato un package PyPI e c'è anche un repository GitHub . Spero che qualcuno lo trovi potenzialmente utile per questo codice.


Python 3.5 ha introdotto un nuovo metodo più veloce per camminare nella directory - os.scandir().

Esempio:

for file in os.scandir('/usr/bin'):
    line = ''
    if file.is_file():
        line += 'f'
    elif file.is_dir():
        line += 'd'
    elif file.is_symlink():
        line += 'l'
    line += '\t'
    print("{}{}".format(line, file.name))

Usare i generatori

import os
def get_files(search_path):
     for (dirpath, _, filenames) in os.walk(search_path):
         for filename in filenames:
             yield os.path.join(dirpath, filename)
list_files = get_files('.')
for filename in list_files:
    print(filename)

Preferisco usare il modulo glob , in quanto esegue la corrispondenza e l'espansione dei pattern.

import glob
print(glob.glob("/home/adam/*.txt"))

Restituirà una lista con i file interrogati:

['/home/adam/file1.txt', '/home/adam/file2.txt', .... ]

import os
import os.path


def get_files(target_dir):
    item_list = os.listdir(target_dir)

    file_list = list()
    for item in item_list:
        item_dir = os.path.join(target_dir,item)
        if os.path.isdir(item_dir):
            file_list += get_files(item_dir)
        else:
            file_list.append(item_dir)
    return file_list

Qui uso una struttura ricorsiva.


Una soluzione a una riga per ottenere solo l'elenco dei file (senza sottodirectory):

filenames = next(os.walk(path))[2]

o percorsi assoluti:

paths = [os.path.join(path,fn) for fn in next(os.walk(path))[2]]

Facendo riferimento alla risposta di @adamk, ecco il mio metodo di rilevamento os in risposta al commento di incoerenza della barra di @Anti Earth

import sys
import os
from pathlib import Path
from glob import glob
platformtype = sys.platform
if platformtype == 'win32':
    slash = "\\"
if platformtype == 'darwin':
    slash = "/"

# TODO: How can I list all files of a directory in Python and add them to a list?

# Step 1 - List all files of a directory

# Method 1: Find only pre-defined filetypes (.txt) and no subfiles, answer provided by @adamk
dir1 = "%sfoo%sbar%s*.txt" % (slash)
_files = glob(dir1)

# Method 2: Find all files and no subfiles
dir2 = "%sfoo%sbar%s" % (slash)
_files = (x for x in Path("dir2").iterdir() if x.is_file())

# Method 3: Find all files and all subfiles
dir3 = "%sfoo%sbar" % (slash)
_files = (x for x in Path('dir3').glob('**/*') if x.is_file())


# Step 2 - Add them to a list

files_list = []
for eachfiles in _files:
    files_basename = os.path.basename(eachfiles)
    files_list.append(files_basename)
print(files_list)
['file1.txt', 'file2.txt', .... ]

Suppongo che tu voglia solo i nomi di basenames nella lista.

Fare riferimento a questo post per la definizione predefinita di più formati di file per Metodo 1.


Dalla versione 3.4 ci sono gli iteratori integrati per questo che sono molto più efficienti di os.listdir() :

pathlib : Novità nella versione 3.4.

>>> import pathlib
>>> [p for p in pathlib.Path('.').iterdir() if p.is_file()]

Secondo PEP 428 , lo scopo della libreria pathlib è di fornire una semplice gerarchia di classi per gestire i percorsi del filesystem e le operazioni comuni che gli utenti eseguono su di essi.

os.scandir() : nuovo nella versione 3.5.

>>> import os
>>> [entry for entry in os.scandir('.') if entry.is_file()]

Si noti che os.walk() utilizza os.scandir() posto di os.listdir() dalla versione 3.5 e la sua velocità è aumentata di 2-20 volte secondo PEP 471 .

Consentitemi anche di leggere il commento di ShadowRanger qui sotto.





directory