web-dev-qa-db-fra.com

Lecture de tous les fichiers d'un répertoire

Le code suivant est pour lire tous les fichiers dans le répertoire de téléchargement, mais quand j’exécute ce code, il ne sera pas imprimé, quel est le problème avec ce code ..?

import glob   
path = '/home/mypc/download/*.html'   
files=glob.glob(path)   
for file in files:     
    f=open(file, 'r')  
    f.readlines()   
    f.close() 
4
Naive

La méthode readlines() d'un objet fichier renvoie une liste Python. Il n'écrit pas automatiquement sur stdout le contenu du fichier: Python est un langage de script, mais pas un langage de script Shell!

Vous devriez remplacer:

f.readlines()

avec:

sys.stdout.write(f.read())

Notez que j'utilise read() au lieu de readlines(). Comme je l'ai dit, readlines() retourne une liste, mais ici nous voulons imprimer une chaîne - et read() fait ce que nous voulons: il lit tout le fichier et renvoie une chaîne. Ce n’est pas optimal lorsque le fichier est volumineux (car il utilise énormément de mémoire), mais cela fonctionne.

Il est à noter que votre code est défectueux. Vous avez dit: le code suivant consiste à lire tous les fichiers du répertoire de téléchargement. Votre code tentera en réalité de lire à la fois les fichiers et les répertoires se terminant par .html. Si votre code trouve un répertoire se terminant par .html, il se plantera bruyamment.

Enfin, vous devriez préférer utiliser l'instruction with lors de l'ouverture de fichiers, en particulier lorsque vous ouvrez de nombreux fichiers. L'instruction with vous assurera que le fichier est fermé dès que vous avez fini de l'utiliser, même en cas d'erreur.

Par conséquent, votre code devrait ressembler à ceci:

import sys
import glob
import errno

path = '/home/mypc/download/*.html'   
files = glob.glob(path)   
for name in files: # 'file' is a builtin type, 'name' is a less-ambiguous variable name.
    try:
        with open(name) as f: # No need to specify 'r': this is the default.
            sys.stdout.write(f.read())
    except IOError as exc:
        if exc.errno != errno.EISDIR: # Do not fail if a directory is found, just ignore it.
            raise # Propagate other kinds of IOError.
8

Vous voudrez peut-être utiliser au moins un print. Par exemple:

#!/usr/bin/env python

import glob   
path = '/home/mypc/download/*.html'   
files=glob.glob(path)   
for file in files:     
    f=open(file, 'r')  
    print '%s' % f.readlines()   
    f.close()
    #if you want to print only the filenames, use 'print file' instead of three previous lines

Et s'il vous plaît lisez la documentation sur Entrée et Sortie en Python .

4
Radu Rădeanu

Si vous souhaitez afficher les noms de fichiers dont vous avez besoin pour utiliser la commande d'impression

import glob   
path = '/home/mypc/download/*.html'   
files=glob.glob(path)   
for file in files: 
    print file
1
Lars H

Vous avez seulement écrit du code pour lire les fichiers, pas pour imprimer le contenu. Si c'est ce que vous voulez faire, vous pouvez remplacer

f.readlines() 

avec:

for line in f:
    print line 

J'espère que cela pourra aider.

1
Sazhen86