Bir klasördeki her dosya nasıl açılır?


154

Bir python betiğim parse.py var, betikte bir dosya açıyor, dosya1 diyor ve sonra bir şeyler yapıyor, belki toplam karakter sayısını yazdırıyor.

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

Şu anda, sonucu çıktı dosyama yönlendirmek için stdout kullanıyorum - çıktı

python parse.py >> output

Ancak, bu dosyayı dosyaya manuel olarak yapmak istemiyorum, her bir dosyayı otomatik olarak halletmenin bir yolu var mı? Sevmek

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

O zaman sorun, dosya adını standardin'den nasıl okuyabilirim? veya zaten ls ve bu tür işleri kolayca yapmak için bazı yerleşik işlevler var mı?

Teşekkürler!

Yanıtlar:


362

İşletim sistemi

Geçerli dizindeki tüm dosyaları şunları kullanarak listeleyebilirsiniz 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

Küre

Veya globmodülü kullanarak dosya modeline bağlı olarak yalnızca bazı dosyaları listeleyebilirsiniz :

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

Geçerli dizin olmak zorunda değildir, bunları istediğiniz herhangi bir yolda listeleyebilirsiniz:

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

Boru Veya kullanarak belirttiğiniz gibi boruyu bile kullanabilirsinizfileinput

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

Ve sonra onu borularla kullanın:

ls -1 | python parse.py

2
bu da dosyanın otomatik olarak açılıp kapanmasını sağlıyor mu? with ... as ...:İfadeleri kullanmamanıza şaşırdım . Açıklar mısın
Charlie Parker

4
Charlie, glob.glob ve os.listdir dosya adlarını döndürür. Daha sonra bunları döngü içinde birer birer açarsınız.
David R

Doğru bir çözüm olması için bu yanıt, düşündüğüm şeyi içermelidir. Aksi takdirde yanıt, önceden var olan "bir dizindeki tüm dosyaların nasıl listeleneceğidir" Q and A
Hack-R

Birinci ve ikinci çözümler Windows kullanıcıları için çalışıyor, üçüncü çözüm işe yaramadı, Windows veriyorPermission Error: [Errno 13] Permission denied:
Roshna Omer

35

os.walk kullanmayı denemelisiniz

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

17

Bu cevabı arıyordum:

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

dosya adınızın '* .txt' veya diğer uçlarını da seçebilirsiniz


cevap budur çünkü bir dizindeki tüm dosyaları okuyorsunuz; D
Khan

10

Aslında her ikisini de yapmak için os modülünü kullanabilirsiniz :

  1. bir klasördeki tüm dosyaları listele
  2. dosyaları dosya türüne, dosya adına vb. göre sıralayın.

İşte basit bir örnek:

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

Artık bir klasördeki tüm dosyaları listelemekle kalmadınız, aynı zamanda (isteğe bağlı olarak) başlangıç ​​adına, dosya türüne ve diğerlerine göre sıralandınız. Hemen şimdi her listeyi tekrarlayın ve işlerinizi yapın.


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

1
Bu, PyPerClip ve PyAutoGui kullanarak bir dizindeki her PDF dosyasını açar, yazdırır ve kapatır. Başkalarının bunu faydalı bulmasını umuyoruz.
RockwellS

1

Aşağıdaki kod, çalıştırdığımız betiği içeren dizinde bulunan herhangi bir metin dosyasını okur. Ardından her metin dosyasını açar ve metin satırındaki kelimeleri bir listede saklar. Kelimeleri sakladıktan sonra her kelimeyi satır satır yazdırıyoruz

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)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.