Làm thế nào để mở mọi tập tin trong một thư mục?


148

Tôi có một đoạn mã python parse.py, trong kịch bản mở một tệp, giả sử tệp1, và sau đó làm một cái gì đó có thể in ra tổng số ký tự.

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

Ngay bây giờ, tôi đang sử dụng thiết bị xuất chuẩn để hướng kết quả đến tệp đầu ra của mình - đầu ra

python parse.py >> output

Tuy nhiên, tôi không muốn thực hiện tệp này bằng tệp thủ công, có cách nào để tự động chăm sóc từng tệp một không? Giống

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

Sau đó, vấn đề là làm thế nào tôi có thể đọc tên tệp từ Standardin? hoặc đã có một số chức năng tích hợp sẵn để thực hiện ls và những loại công việc đó một cách dễ dàng?

Cảm ơn!

Câu trả lời:


348

Ôi

Bạn có thể liệt kê tất cả các tệp trong thư mục hiện tại bằng cách sử dụng 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

Quả cầu

Hoặc bạn chỉ có thể liệt kê một số tệp, tùy thuộc vào mẫu tệp bằng globmô-đun:

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

Nó không phải là thư mục hiện tại bạn có thể liệt kê chúng theo bất kỳ đường dẫn nào bạn muốn:

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

Ống Hoặc thậm chí bạn có thể sử dụng đường ống như bạn đã chỉ định bằng cách sử dụngfileinput

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

Và sau đó sử dụng nó với đường ống:

ls -1 | python parse.py

2
Điều này cũng xử lý việc mở và đóng tập tin tự động? Tôi ngạc nhiên khi bạn không sử dụng with ... as ...:báo cáo. Bạn có thể làm rõ?
Charlie Parker

4
Charlie, global.glob và os.listdir trả lại tên tệp. Sau đó, bạn sẽ mở từng cái một trong vòng lặp.
David R

Để trở thành một giải pháp thực sự, câu trả lời này nên bao gồm những gì tôi nghĩ. Mặt khác, câu trả lời là một bản sao của "cách liệt kê tất cả các tệp trong một thư mục" đã có từ trước - Q-A
Hack-R

Các giải pháp thứ nhất và thứ hai hoạt động cho người dùng Windows , giải pháp thứ ba không hoạt động, Windows cung cấpPermission Error: [Errno 13] Permission denied:
Roshna Omer

34

bạn nên thử sử dụng 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

Tôi đã tìm kiếm câu trả lời này:

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

bạn cũng có thể chọn '* .txt' hoặc các đầu khác của tên tệp của bạn


Đây là câu trả lời vì bạn đang đọc tất cả các tệp trong một thư mục; D
Khan

10

Bạn thực sự có thể chỉ cần sử dụng mô-đun os để làm cả hai:

  1. liệt kê tất cả các tập tin trong một thư mục
  2. sắp xếp tập tin theo loại tập tin, tên tập tin, vv

Đây là một ví dụ đơn giản:

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

Bây giờ bạn không chỉ liệt kê tất cả các tệp trong một thư mục mà còn sắp xếp chúng (tùy chọn) theo tên bắt đầu, loại tệp và các tệp khác. Chỉ cần lặp đi lặp lại qua từng danh sách và làm công cụ của bạ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
Thao tác này sẽ mở, in, đóng mọi tệp PDF trong một thư mục bằng PyPerClip và PyAutoGui. Hy vọng những người khác tìm thấy điều này hữu ích.
RockwellS

0

Mã dưới đây đọc cho bất kỳ tệp văn bản có sẵn trong thư mục chứa tập lệnh chúng tôi đang chạy. Sau đó, nó sẽ mở mọi tệp văn bản và lưu trữ các từ của dòng văn bản vào một danh sách. Sau khi lưu trữ các từ, chúng tôi in từng dòng từ theo dòng

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)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.