Lendo todos os arquivos de um diretório [closed]

3

O código a seguir é para ler todos os arquivos no diretório de download, mas quando executo este código ele não imprime (exibe), o que há de errado com este código ..?

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

4 respostas

8

O método readlines() de um objeto de arquivo retorna uma lista do Python. Ele não grava automaticamente no stdout o conteúdo do arquivo: Python é uma linguagem de script, mas não uma linguagem shell script!

Você deve substituir:

f.readlines()

com:

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

Observe que estou usando read() em vez de readlines() . Como eu disse, readlines() retorna uma lista, mas aqui queremos imprimir uma string - e read() faz o que queremos: lê o arquivo inteiro e retorna uma string. Não é ideal quando o arquivo é enorme (porque ele usa uma quantidade enorme de memória), mas funciona.

Vale a pena notar que o seu código é falho. Você disse: seguir código é ler todos os arquivos no diretório de download . Seu código, na verdade, tentará ler os arquivos e diretórios terminados em .html . Se o seu código encontrar um diretório que termine com .html , ele falhará em voz alta.

Por fim, você deve preferir usar a instrução with ao abrir arquivos, especialmente quando estiver abrindo muitos arquivos. A instrução with garantirá que o arquivo seja fechado assim que você terminar de trabalhar com ele, mesmo que ocorra um erro.

Portanto, seu código deve ficar assim:

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.
    
por Andrea Corbellini 01.10.2013 / 10:14
4

Você pode querer usar pelo menos um print . Por exemplo:

#!/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

E, por favor, leia alguma documentação sobre Entrada e saída em Python .

    
por Radu Rădeanu 01.10.2013 / 10:16
1

Você escreveu apenas um código para ler os arquivos e não para imprimir o conteúdo. Se é isso que você quer fazer, você pode substituir

f.readlines() 

com:

for line in f:
    print line 

Espero que ajude.

    
por Sazhen86 01.10.2013 / 10:15
1

Eu quero exibir os nomes dos arquivos que você precisa para usar o comando de impressão

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