216 votes

Comment ouvrir tous les fichiers d'un dossier

J'ai un python script parse.py, qui dans le script ouvre un fichier, disons file1, et ensuite fait quelque chose peut-être imprimer le nombre total de caractères.

filename = 'file1'
f = open(filename, 'r')
content = f.read()
print filename, len(content)

Pour l'instant, j'utilise stdout pour diriger le résultat vers mon fichier de sortie - output

python parse.py >> output

Cependant, je ne veux pas faire cela fichier par fichier manuellement, y a-t-il un moyen de s'occuper de chaque fichier automatiquement ? Comme

ls | awk '{print}' | python parse.py >> output 

Le problème est alors de savoir comment lire le nom du fichier à partir de standardin. Ou bien il y a déjà des fonctions intégrées pour faire le ls et ce genre de travail facilement ?

Gracias.

466voto

Viktor Kerkez Points 11222

Os

Vous pouvez lister tous les fichiers dans le répertoire courant en utilisant os.listdir :

import os
for filename in os.listdir(os.getcwd()):
   with open(os.path.join(os.getcwd(), filename), 'r') as f: # open in readonly mode
      # do your stuff

Glob

Ou vous pouvez lister seulement certains fichiers, selon le modèle de fichier en utilisant la fonction glob module :

import os, glob
for filename in glob.glob('*.txt'):
   with open(os.path.join(os.getcwd(), filename), 'r') as f: # open in readonly mode
      # do your stuff

Il n'est pas nécessaire que ce soit le répertoire courant, vous pouvez les lister dans le chemin que vous voulez :

import os, glob
path = '/some/path/to/file'
for filename in glob.glob(os.path.join(path, '*.txt')):
   with open(os.path.join(os.getcwd(), filename), 'r') as f: # open in readonly mode
      # do your stuff

Tuyau

Ou vous pouvez même utiliser le tuyau comme vous l'avez spécifié en utilisant fileinput

import fileinput
for line in fileinput.input():
    # do your stuff

Et vous pouvez ensuite l'utiliser avec un passepoil :

ls -1 | python parse.py

45voto

le_vine Points 761

Vous devriez essayer d'utiliser os.walk .

import os

yourpath = 'path'

for root, dirs, files in os.walk(yourpath, topdown=False):
    for name in files:
        print(os.path.join(root, name))
        stuff
    for name in dirs:
        print(os.path.join(root, name))
        stuff

32voto

Andrei Points 499

Je cherchais cette réponse :

import os,glob
folder_path = '/some/path/to/file'
for filename in glob.glob(os.path.join(folder_path, '*.htm')):
  with open(filename, 'r') as f:
    text = f.read()
    print (filename)
    print (len(text))

Vous pouvez également choisir '*.txt' ou d'autres extrémités de votre nom de fichier.

12voto

geekidharsh Points 2117

Vous pouvez en fait simplement utiliser module os pour faire les deux :

  1. liste tous les fichiers d'un dossier
  2. trier les fichiers par type de fichier, nom de fichier, etc.

Voici un exemple simple :

import os #os module imported here
location = os.getcwd() # get present working directory location here
counter = 0 #keep a count of all files found
csvfiles = [] #list to store all csv files found at location
filebeginwithhello = [] # list to keep all files that begin with 'hello'
otherfiles = [] #list to keep any other file that do not match the criteria

for file in os.listdir(location):
    try:
        if file.endswith(".csv"):
            print "csv file found:\t", file
            csvfiles.append(str(file))
            counter = counter+1

        elif file.startswith("hello") and file.endswith(".csv"): #because some files may start with hello and also be a csv file
            print "csv file found:\t", file
            csvfiles.append(str(file))
            counter = counter+1

        elif file.startswith("hello"):
            print "hello files found: \t", file
            filebeginwithhello.append(file)
            counter = counter+1

        else:
            otherfiles.append(file)
            counter = counter+1
    except Exception as e:
        raise e
        print "No files found here!"

print "Total files found:\t", counter

Maintenant, vous avez non seulement listé tous les fichiers d'un dossier mais vous les avez aussi (facultativement) triés par nom de départ, type de fichier et autres. Il suffit maintenant d'itérer sur chaque liste et de faire votre travail.

3voto

RockwellS Points 86
import pyautogui
import keyboard
import time
import os
import pyperclip

os.chdir("target directory")

# get the current directory
cwd=os.getcwd()

files=[]

for i in os.walk(cwd):
    for j in i[2]:
        files.append(os.path.abspath(j))

os.startfile("C:\Program Files (x86)\Adobe\Acrobat 11.0\Acrobat\Acrobat.exe")
time.sleep(1)

for i in files:
    print(i)
    pyperclip.copy(i)
    keyboard.press('ctrl')
    keyboard.press_and_release('o')
    keyboard.release('ctrl')
    time.sleep(1)

    keyboard.press('ctrl')
    keyboard.press_and_release('v')
    keyboard.release('ctrl')
    time.sleep(1)
    keyboard.press_and_release('enter')
    keyboard.press('ctrl')
    keyboard.press_and_release('p')
    keyboard.release('ctrl')
    keyboard.press_and_release('enter')
    time.sleep(3)
    keyboard.press('ctrl')
    keyboard.press_and_release('w')
    keyboard.release('ctrl')
    pyperclip.copy('')

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X