フォルダー内のすべてのファイルを開く方法は?


148

私はpythonスクリプトparse.pyを持っています。このスクリプトでは、file1などのファイルを開いてから、合計文字数を出力することができます。

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

現在、標準出力を使用して結果を出力ファイルに出力しています-出力

python parse.py >> output

しかし、手動でこのファイルを作成したくないのですが、すべてのファイルを自動的に処理する方法はありますか?お気に入り

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

次に、問題はどのように標準化からファイル名を読み取ることができますか?または、lsとその種の作業を簡単に行うための組み込み関数がすでにいくつかありますか?

ありがとう!

回答:


348

Os

次のコマンドを使用して、現在のディレクトリにあるすべてのファイルを一覧表示できます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モジュールを使用するファイルパターンに応じて、一部のファイルのみを一覧表示できます。

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

現在のディレクトリである必要はなく、任意のパスにリストできます。

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

パイプ または、指定したとおりにパイプを使用することもできますfileinput

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

そしてそれをパイピングで使用します:

ls -1 | python parse.py

2
これはファイルの開閉も自動的に処理しますか?with ... as ...:ステートメントを使用していないことに驚いています。明確にしてもらえますか?
チャーリーパーカー、

4
Charlie、glob.glob、os.listdirはファイル名を返します。次に、ループ内でそれらを1つずつ開きます。
David R

真の解決策となるためには、この答えには私が思うことを含める必要があります。それ以外の場合の答えは、既存の「ディレクトリ内のすべてのファイルを一覧表示する方法」のQとAの
複製です

最初と2番目のソリューションはWindowsユーザーに対して機能し、3番目のソリューションは機能しませんでした。Windowsが提供しますPermission Error: [Errno 13] Permission denied:
Roshna Omer

34

あなたは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

15

私はこの答えを探していました:

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

「* .txt」またはファイル名の他の端も選択できます


これは、ディレクトリ内のすべてのファイルを読んでいるので、答えは、D
カーン

10

あなたは実際に両方を行うためにosモジュールを使うことができます

  1. フォルダ内のすべてのファイルを一覧表示する
  2. ファイルタイプ、ファイル名などでファイルを並べ替える

以下に簡単な例を示します。

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

これで、フォルダー内のすべてのファイルがリストされただけでなく、それらを(オプションで)開始名、ファイルタイプなどで並べ替えることができました。ちょうど今、各リストを繰り返して、あなたのことをします。


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
これは、PyPerClipとPyAutoGuiを使用して、ディレクトリ内のすべてのPDFを開き、印刷し、閉じます。他の人がこれが役に立てば幸いです。
RockwellS

0

以下のコードは、実行中のスクリプトを含むディレクトリにあるテキストファイルを読み取ります。次に、すべてのテキストファイルを開き、テキスト行の単語をリストに保存します。単語を保存した後、各単語を1行ずつ印刷します

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)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.