Vraag Zoeken naar functies voor bestandsverplaatsing in Python die op Java lijken


In Java kun je dat doen File.listFiles() en ontvang alle bestanden in een map. U kunt dan gemakkelijk recurse via mapbomen.

Is er een analoge manier om dit in Python te doen?


10
2017-09-26 17:20


oorsprong


antwoorden:


Ja dat is er. De Python-weg is nog beter.

Er zijn drie mogelijkheden:

1) Zoals File.listFiles ():

Python heeft de functie os.listdir (pad). Het werkt als de Java-methode.

2) padnaam patroonuitbreiding met glob:

De module glob bevat functies om bestanden op het bestandssysteem weer te geven met behulp van het Unix shell-achtig patroon, b.v.

bestanden = glob.glob ('/ usr / joe / *. gif')

3) Bestandsdoorgang met lopen:

Echt leuk is de os.walk-functie van Python.

Met de methode walk wordt een generatiefunctie geretourneerd die recursief alle mappen en bestanden onder een bepaald startpad vermeldt.

Een voorbeeld:  

import os
van os.path import join
voor root, mappen, bestanden in os.walk ('/ usr'):
   print "Huidige map", root
   print "Submappen", mappen
   print "Bestanden", bestanden
Je kunt zelfs mappen verwijderen van "dirs" om te vermijden dat je naar die map loopt: als "joe" in mappen: dirs.remove ("joe") om te voorkomen dat je de mappen "joe" binnenkomt.

listdir en walk zijn gedocumenteerd hier. glob is gedocumenteerd hier.


25
2017-09-26 17:30



Als een lange tijd Pythonista, moet ik zeggen dat de pad / bestandsmanipulatiefuncties in de std-bibliotheek sub-par zijn: ze zijn niet object-georiënteerd en ze weerspiegelen een verouderde, laat-wrap-OS-systeem-functies-zonder- denkfilosofie. Ik zou de 'pad'-module van harte aanbevelen als een wrapper (rond os, os.path, glob en tempfile als je moet weten): veel leuker en OOPy: http://pypi.python.org/pypi/path.py/2.2

Dit is walk () met de padmodule:

dir = path(os.environ['HOME'])
for f in dir.walk():
    if f.isfile() and f.endswith('~'):
        f.remove()

5
2017-09-27 08:27



Probeer "listdir ()" in de os-module (docs):

import os
print os.listdir('.')

3
2017-09-26 17:26



Rechtstreeks vanuit de Refererence Library van Python

>>> import glob
>>> glob.glob('./[0-9].*')
['./1.gif', './2.txt']
>>> glob.glob('*.gif')
['1.gif', 'card.gif']
>>> glob.glob('?.gif')
['1.gif']

2
2017-09-26 17:24



Kijk eens naar os.walk() en de voorbeelden hier. Met os.walk() u kunt eenvoudig een hele mappenboom verwerken.

Een voorbeeld van de bovenstaande link ...

# Delete everything reachable from the directory named in 'top',
# assuming there are no symbolic links.
# CAUTION:  This is dangerous!  For example, if top == '/', it
# could delete all your disk files.
import os
for root, dirs, files in os.walk(top, topdown=False):
    for name in files:
        os.remove(os.path.join(root, name))
    for name in dirs:
        os.rmdir(os.path.join(root, name))

2
2017-09-26 17:27



Gebruik os.path.walk als u ook submappen wilt.

lopen (top, func, arg)

        Folderboomloop met callback-functie.

        Voor elke map in de boomstructuur die bovenaan is gerold (inclusief bovenaan
        zelf, maar exclusief '.' en '..'), bel func (arg, dirname, fnames).
        dirname is de naam van de directory en geeft een lijst met de namen van
        de bestanden en submappen in dirname (met uitzondering van '.' en '..'). func
        kan de fnames-lijst op zijn plaats wijzigen (bijvoorbeeld via del- of slice-toewijzing),
        en walk zal alleen recurse in de submappen waarvan de namen blijven
        fnames; dit kan worden gebruikt om een ​​filter te implementeren of om een ​​specifiek filter op te leggen
        volgorde van bezoeken. Geen semantiek gedefinieerd voor, of vereist van, arg,
        voorbij dat arg wordt altijd doorgegeven aan func. Het kan bijvoorbeeld worden gebruikt om te passeren
        een bestandsnaampatroon of een veranderlijk object dat is ontworpen om te accumuleren
        statistieken. Het doorgeven van None voor arg is normaal.

2
2017-09-26 17:31



Ik zou het aanbevelen os.path.walk zoals het wordt verwijderd in Python 3.0. os.walk is hoe dan ook eenvoudiger, of tenminste ik vind het eenvoudiger.


2
2017-09-26 18:58



Je kunt ook uitchecken Unipath, een object-georiënteerde wikkel van Python's os, os.path en shutil modules.

Voorbeeld:

>>> from unipath import Path
>>> p = Path('/Users/kermit')
>>> p.listdir()
Path(u'/Users/kermit/Applications'),
Path(u'/Users/kermit/Desktop'),
Path(u'/Users/kermit/Documents'),
Path(u'/Users/kermit/Downloads'),
...

Installatie via Kaaswinkel:

$ pip install unipath

1
2017-08-27 12:50



Aangezien ik lang in python heb geprogrammeerd, heb ik de os-module vele malen gebruikt en mijn eigen functie gemaakt om alle bestanden in een map af te drukken.

De code voor de functie:

import os

def PrintFiles(direc):
    files = os.listdir(direc)
    for x in range(len(files)):
        print("File no. "+str(x+1)+": "+files[x])

PrintFiles(direc)

0
2018-02-29 17:26