Bagaimana cara membuka setiap file dalam folder?


148

Saya memiliki skrip python parse.py, yang dalam skrip membuka file, katakan file1, dan kemudian melakukan sesuatu mungkin mencetak jumlah total karakter.

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

Saat ini, saya menggunakan stdout untuk mengarahkan hasilnya ke file output - output

python parse.py >> output

Namun, saya tidak ingin melakukan file ini dengan file secara manual, apakah ada cara untuk mengurus setiap file secara otomatis? Suka

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

Lalu masalahnya adalah bagaimana saya bisa membaca nama file dari standardin? atau sudah ada beberapa fungsi bawaan untuk melakukan ls dan pekerjaan seperti itu dengan mudah?

Terima kasih!

Jawaban:


349

Os

Anda dapat membuat daftar semua file di direktori saat ini menggunakan 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

Gumpal

Atau Anda dapat mendaftar hanya beberapa file, tergantung pada pola file menggunakan 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

Itu tidak harus menjadi direktori saat ini Anda bisa daftar mereka di jalur apa pun yang Anda inginkan:

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

Pipa Atau Anda bahkan dapat menggunakan pipa seperti yang Anda tentukan menggunakanfileinput

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

Dan kemudian menggunakannya dengan perpipaan:

ls -1 | python parse.py

2
apakah ini menangani pembukaan dan penutupan file secara otomatis juga? Saya terkejut Anda tidak menggunakan with ... as ...:pernyataan. Bisakah Anda mengklarifikasi?
Charlie Parker

4
Charlie, glob.glob dan os.listdir mengembalikan nama file. Anda kemudian akan membuka satu per satu di dalam loop.
David R

Untuk menjadi solusi sejati, jawaban ini harus mencakup yang saya kira. Kalau tidak, jawabannya adalah penipuan dari "bagaimana mendaftar semua file dalam direktori" yang sudah ada sebelumnya - Q dan A
Hack-R

Solusi pertama dan kedua bekerja untuk pengguna Windows solusi ketiga tidak bekerja, Windows memberikanPermission Error: [Errno 13] Permission denied:
Roshna Omer

34

Anda harus mencoba menggunakan 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

Saya mencari jawaban ini:

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

Anda juga dapat memilih '* .txt' atau ujung lain dari nama file Anda


ini jawabannya karena Anda membaca semua file dalam direktori; D
Khan

10

Anda sebenarnya dapat menggunakan modul os untuk melakukan keduanya:

  1. daftar semua file dalam folder
  2. mengurutkan file berdasarkan jenis file, nama file dll.

Berikut ini contoh sederhana:

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

Sekarang Anda tidak hanya mendaftar semua file dalam folder tetapi juga memilikinya (secara opsional) diurutkan berdasarkan nama awal, jenis file, dan lainnya. Baru saja beralih ke setiap daftar dan lakukan tugasmu.


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
Ini membuka, mencetak, menutup setiap PDF dalam direktori menggunakan PyPerClip dan PyAutoGui. Semoga orang lain menemukan ini bermanfaat.
RockwellS

0

Kode di bawah ini membaca untuk setiap file teks yang tersedia di direktori yang berisi skrip yang sedang kami jalankan. Kemudian itu membuka setiap file teks dan menyimpan kata-kata dari baris teks ke dalam daftar. Setelah menyimpan kata-kata kita mencetak setiap kata baris demi baris

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)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.