¿Cómo abrir cada archivo en una carpeta?

148

Tengo un script de python parse.py, que en el script abre un archivo, dice file1 y luego hace algo, tal vez imprima el número total de caracteres.

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

En este momento, estoy usando stdout para dirigir el resultado a mi archivo de salida - salida

python parse.py >> output

Sin embargo, no quiero hacer este archivo por archivo manualmente, ¿hay alguna manera de cuidar cada archivo automáticamente? Me gusta

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

Entonces el problema es ¿cómo podría leer el nombre del archivo de standardin? o ya hay algunas funciones integradas para hacer ls y ese tipo de trabajo fácilmente?

¡Gracias!

B.Mr.W.
fuente

Respuestas:

349

Os

Puede enumerar todos los archivos en el directorio actual 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

O puede enumerar solo algunos archivos, dependiendo del patrón de archivo que utiliza el 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

No tiene que ser el directorio actual, puede enumerarlos en la ruta que desee:

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

Tubería O incluso puede usar la tubería como especificó usandofileinput

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

Y luego úsalo con tuberías:

ls -1 | python parse.py
Viktor Kerkez
fuente
2
¿esto también maneja el archivo abriéndose y cerrándose automáticamente? Me sorprende que no uses with ... as ...:declaraciones. ¿Podrías aclarar?
Charlie Parker
44
Charlie, glob.glob y os.listdir devuelven los nombres de archivo. Luego los abriría uno por uno dentro del bucle.
David R
Para ser una verdadera solución, esta respuesta debería incluir eso, creo. De lo contrario, la respuesta es un engaño de las preguntas y respuestas preexistentes sobre "cómo enumerar todos los archivos en un directorio"
Hack-R
La primera y la segunda solución funcionan para los usuarios de Windows, la tercera solución no funcionó, da WindowsPermission Error: [Errno 13] Permission denied:
Roshna Omer
34

deberías intentar 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
fuente
15

Estaba buscando esta respuesta:

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

también puede elegir '* .txt' u otros extremos de su nombre de archivo

Andrei
fuente
esta es la respuesta porque está leyendo todos los archivos en un directorio; D
Khan
10

En realidad, solo puede usar el módulo os para hacer ambas cosas:

  1. enumerar todos los archivos en una carpeta
  2. ordenar archivos por tipo de archivo, nombre de archivo, etc.

Aquí hay un ejemplo 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

Ahora no solo ha enumerado todos los archivos en una carpeta, sino que también los ha ordenado (opcionalmente) por nombre de inicio, tipo de archivo y otros. Recién itera sobre cada lista y haz tus cosas.

geekidharsh
fuente
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
fuente
1
Esto abre, imprime, cierra cada PDF en un directorio usando PyPerClip y PyAutoGui. Espero que otros encuentren esto útil.
RockwellS
0

El siguiente código lee los archivos de texto disponibles en el directorio que contiene el script que estamos ejecutando. Luego abre todos los archivos de texto y almacena las palabras de la línea de texto en una lista. Después de almacenar las palabras, imprimimos cada palabra línea por línea

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
fuente