Comment ouvrir chaque fichier dans un dossier?

148

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

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

En ce moment, j'utilise stdout pour diriger le résultat vers mon fichier de sortie - sortie

python parse.py >> output

Cependant, je ne veux pas faire ce fichier par fichier manuellement, existe-t-il un moyen de prendre en charge automatiquement chaque fichier? Comme

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

Alors le problème est de savoir comment pourrais-je lire le nom de fichier à partir de standardin? ou il existe déjà des fonctions intégrées pour faire les ls et ce genre de travail facilement?

Merci!

B.Mr.W.
la source

Réponses:

349

Os

Vous pouvez lister tous les fichiers du répertoire actuel en utilisant os.listdir:

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

Glob

Ou vous pouvez lister uniquement certains fichiers, en fonction du modèle de fichier à l'aide du globmodule:

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

Il n'est pas nécessaire que ce soit le répertoire actuel, vous pouvez les lister dans le chemin de votre choix:

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

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

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

Et puis utilisez-le avec la tuyauterie:

ls -1 | python parse.py
Viktor Kerkez
la source
2
cela gère-t-il également l'ouverture et la fermeture du fichier automatiquement? Je suis surpris que vous n'utilisiez pas de with ... as ...:déclarations. Pourriez-vous clarifier?
Charlie Parker
4
Charlie, glob.glob et os.listdir renvoient les noms de fichiers. Vous les ouvririez ensuite un par un dans la boucle.
David R
Pour être une vraie solution, cette réponse devrait inclure cela, je pense. Sinon, la réponse est une dupe du préexistant "comment lister tous les fichiers dans un répertoire" Q et A's
Hack-R
Les première et deuxième solutions fonctionnent pour les utilisateurs de Windows, la troisième solution n'a pas fonctionné, Windows donnePermission Error: [Errno 13] Permission denied:
Roshna Omer
34

vous devriez essayer d'utiliser os.walk

yourpath = 'path'

import os
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
le_vine
la source
15

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

Andrei
la source
c'est la réponse parce que vous lisez tous les fichiers dans un répertoire; D
Khan
10

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

  1. lister tous les fichiers dans 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

Désormais, vous avez non seulement répertorié tous les fichiers dans un dossier, mais vous les avez également triés (éventuellement) par nom de départ, type de fichier et autres. Maintenant, parcourez chaque liste et faites votre travail.

geekidharsh
la source
2
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('')
RockwellS
la source
1
Cela ouvre, imprime, ferme chaque PDF dans un répertoire en utilisant PyPerClip et PyAutoGui. J'espère que d'autres trouveront cela utile.
RockwellS
0

Le code ci-dessous lit tous les fichiers texte disponibles dans le répertoire qui contient le script que nous exécutons. Ensuite, il ouvre chaque fichier texte et stocke les mots de la ligne de texte dans une liste. Après avoir stocké les mots, nous imprimons chaque mot ligne par ligne

import os, fnmatch

listOfFiles = os.listdir('.')
pattern = "*.txt"
store = []
for entry in listOfFiles:
    if fnmatch.fnmatch(entry, pattern):
        _fileName = open(entry,"r")
        if _fileName.mode == "r":
            content = _fileName.read()
            contentList = content.split(" ")
            for i in contentList:
                if i != '\n' and i != "\r\n":
                    store.append(i)

for i in store:
    print(i)
SKhendle
la source