it-swarm.com.de

Wie kann ich jede Datei in einem Ordner öffnen?

Ich habe ein Python-Skript parse.py, das im Skript eine Datei öffnet, beispielsweise file1, und dann etwas ausführt, möglicherweise die Gesamtzahl der Zeichen. 

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

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

python parse.py >> output

Ich möchte jedoch nicht, dass diese Datei manuell erstellt wird. 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 die ls und diese Art von Arbeit leicht zu erledigen?

Vielen Dank!

102
B.Mr.W.

Sie können alle Dateien im aktuellen Verzeichnis auflisten mit:

import os
for filename in os.listdir(os.getcwd()):
   # do your stuff

Oder Sie können nur einige Dateien auflisten, abhängig vom Dateimuster, das das Modul glob verwendet:

import glob
for filename in glob.glob('*.txt'):
   # do your stuff

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

path = '/some/path/to/file'

for filename in os.listdir(path):
    # do your stuff

for filename in glob.glob(os.path.join(path, '*.txt')):
    # do your stuff

Oder Sie können die Pipe sogar so verwenden, wie Sie sie mit fileinput angegeben haben.

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

Und dann mit Pfeifen verwenden:

ls -1 | python parse.py
257
Viktor Kerkez

sie sollten os.walk 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
25
le_vine

Sie können eigentlich os module verwenden, um beides zu tun:

  1. liste alle Dateien in einem Ordner auf
  2. dateien nach Dateityp, Dateinamen 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 (optional) auch nach Startnamen, Dateityp und anderen sortiert. Jetzt iteriere ich jede Liste und mache deine Sachen.

7
geekidharsh

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

5
Andrei
import pyautogui
import keyboard
import time
import os
import pyperclip

os.chdir("target 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('')
0
RockwellS