Wie öffne ich jede Datei in einem Ordner?


148

Ich habe ein Python-Skript parse.py, das im Skript eine Datei öffnet, z. B. Datei1, und dann etwas unternimmt, um möglicherweise die Gesamtzahl der Zeichen auszudrucken.

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

Im Moment verwende ich stdout, um das Ergebnis in meine Ausgabedatei - Ausgabe - zu leiten

python parse.py >> output

Ich möchte diese Datei jedoch nicht manuell manuell ausführen. Gibt es eine Möglichkeit, jede einzelne Datei automatisch zu bearbeiten? Mögen

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

Dann ist das Problem, wie könnte ich den Dateinamen von Standardin lesen? oder gibt es bereits einige eingebaute Funktionen, um das ls und diese Art von Arbeit einfach zu erledigen?

Vielen Dank!

Antworten:


348

Os

Sie können alle Dateien im aktuellen Verzeichnis auflisten, indem Sie 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

Oder Sie können nur einige Dateien auflisten, abhängig vom Dateimuster mit dem globModul:

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

Es muss nicht das aktuelle Verzeichnis sein, in dem Sie sie in einem beliebigen Pfad auflisten können:

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

Rohr Oder Sie können das Rohr sogar so verwenden, wie Sie es angegeben habenfileinput

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

Und dann mit Rohrleitungen verwenden:

ls -1 | python parse.py

2
Behandelt dies auch das automatische Öffnen und Schließen von Dateien? Ich bin überrascht, dass Sie keine with ... as ...:Aussagen verwenden. Könnten Sie das klarstellen?
Charlie Parker

4
Charlie, glob.glob und os.listdir geben die Dateinamen zurück. Sie würden diese dann einzeln innerhalb der Schleife öffnen.
David R

Um eine echte Lösung zu sein, sollte diese Antwort Folgendes beinhalten, denke ich. Andernfalls ist die Antwort ein Betrug der bereits vorhandenen Fragen und Antworten zum "Auflisten aller Dateien in einem Verzeichnis"
Hack-R

Die erste und zweite Lösung funktionieren für Windows-Benutzer. Die dritte Lösung hat nicht funktioniert. Windows gibtPermission Error: [Errno 13] Permission denied:
Roshna Omer

34

Sie sollten versuchen, os.walk zu verwenden

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

15

Ich habe nach dieser Antwort gesucht:

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

Sie können auch '* .txt' oder andere Enden Ihres Dateinamens auswählen


Dies ist die Antwort, weil Sie alle Dateien in einem Verzeichnis lesen; D
Khan

10

Sie können das OS-Modul auch einfach verwenden , um beides zu tun:

  1. Listen Sie alle Dateien in einem Ordner auf
  2. Dateien nach Dateityp, Dateiname usw. sortieren.

Hier ist ein einfaches Beispiel:

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

Jetzt haben Sie nicht nur alle Dateien in einem Ordner aufgelistet, sondern sie auch (optional) nach Startname, Dateityp und anderen sortiert. Durchlaufen Sie jetzt jede Liste und erledigen Sie Ihre Aufgaben.


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
Dadurch wird jedes PDF in einem Verzeichnis mit PyPerClip und PyAutoGui geöffnet, gedruckt und geschlossen. Hoffe, andere finden das hilfreich.
RockwellS

0

Der folgende Code lautet für alle Textdateien, die in dem Verzeichnis verfügbar sind, das das von uns ausgeführte Skript enthält. Dann öffnet es jede Textdatei und speichert die Wörter der Textzeile in einer Liste. Nach dem Speichern der Wörter drucken wir jedes Wort Zeile für Zeile

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)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.