Como abrir todos os arquivos em uma pasta?

148

Eu tenho um script python parse.py, que no script abre um arquivo, digamos file1 e, em seguida, faz algo que talvez imprima o número total de caracteres.

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

No momento, estou usando o stdout para direcionar o resultado para o meu arquivo de saída - output

python parse.py >> output

No entanto, eu não quero fazer esse arquivo por arquivo manualmente. Existe uma maneira de cuidar de cada arquivo automaticamente? Gostar

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

Então o problema é como eu poderia ler o nome do arquivo em standardin? ou já existem algumas funções internas para executar o sl e esse tipo de trabalho facilmente?

Obrigado!

B.Mr.W.
fonte

Respostas:

348

Os

Você pode listar todos os arquivos no diretório atual usando 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 você pode listar apenas alguns arquivos, dependendo do padrão de arquivo usando o globmódulo:

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

Não precisa ser o diretório atual, você pode listá-los no caminho que desejar:

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

Tubo Ou você pode até usar o tubo conforme especificado usandofileinput

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

E depois use-o com tubulação:

ls -1 | python parse.py
Viktor Kerkez
fonte
2
isso também lida com a abertura e fechamento automático de arquivos? Estou surpreso por não usar with ... as ...:declarações. Você poderia esclarecer?
Charlie Parker
4
Charlie, glob.glob e os.listdir retornam os nomes dos arquivos. Você abriria os um por um dentro do loop.
David R
Para ser uma solução verdadeira, essa resposta deve incluir o que penso. Caso contrário, a resposta é uma fraude do pré-existente "como listar todos os arquivos em um diretório" Perguntas e respostas
Hack-R
As primeira e segunda soluções funcionam para usuários do Windows a terceira solução não funcionou, o Windows dáPermission Error: [Errno 13] Permission denied:
Roshna Omer
34

você deve tentar usar 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
fonte
15

Eu estava procurando por esta resposta:

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))

você também pode escolher '* .txt' ou outras extremidades do seu nome de arquivo

Andrei
fonte
esta é a resposta porque você está lendo todos os arquivos em um diretório; D
Khan
10

Na verdade, você pode simplesmente usar o módulo os para fazer as duas coisas:

  1. listar todos os arquivos em uma pasta
  2. classificar arquivos por tipo de arquivo, nome do arquivo etc.

Aqui está um exemplo simples:

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

Agora você não apenas listou todos os arquivos em uma pasta, mas também os classificou (opcionalmente) por nome inicial, tipo de arquivo e outros. Agora, faça uma iteração sobre cada lista e faça suas coisas.

geekidharsh
fonte
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
fonte
1
Isso abre, imprime e fecha todos os PDFs em um diretório usando PyPerClip e PyAutoGui. Espero que outros achem isso útil.
Rockwells
0

O código abaixo mostra todos os arquivos de texto disponíveis no diretório que contém o script que estamos executando. Em seguida, ele abre todos os arquivos de texto e armazena as palavras da linha de texto em uma lista. Depois de armazenar as palavras, imprimimos cada palavra linha por linha

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
fonte