Membuat Script Python Untuk Mengekstrak Informasi File Dari Direktori
Pendahuluan
Python adalah bahasa pemrograman yang kuat dan serbaguna dengan kegunaan yang tak terhitung jumlahnya untuk otomatisasi tugas. Dalam skenario ini, perusahaan Anda ingin melakukan audit pada mesin tertentu. Tugas kita adalah membuat skrip yang menarik informasi pada setiap file dalam direktori tertentu.
Buat fungsi yang mendapatkan daftar semua file di direktori tertentu. | |
Ekstrak nama file, jalur, ukuran, dan tanggal pembuatan setiap file, dan masukkan info ini ke dalam daftar. | |
Keluarkan daftar ke dalam format JSON yang dapat dibaca. |
Pengetahuan dasar tentang metode python (fungsi, daftar, kamus, for-loop) | |
sebuah IDE, seperti VS Code. |
Mari kita mulai!
os: Memungkinkan akses ke berbagai metode sistem operasi. datetime: Memungkinkan kita mengonversi keluaran waktu mentah menjadi format yang dapat dibaca. | |
json: Memungkinkan kita mengubah data menjadi format JSON. |
import os
import datetime
import json
Buat fungsi konversi tanggal
Modul os memberi kita waktu dalam satuan detik, yang tidak terlalu membantu kita sebagai manusia rendahan, maka pertama-tama mari kita buat fungsi pembantu yang memungkinkan kita mengonversi tanggal pembuatan jadi format yang bisa dibaca.
Dalam fungsi ini, kami akan menggunakan parameter stempel waktu untuk meneruskan tanggal pembuatan (detik) nanti.
def convertDate(timestamp):
d = datetime.datetime.utcfromtimestamp(timestamp)
formatedDate = d.strftime('%b %d, %Y')
return formatedDate
Metode datetime.utcfromtimestamp() mengubah detik menjadi stempel waktu berformat UTC.
Misalnya, datetime.datetime.utcfromtimestamp(10000) akan memberi kita output 1970-01-01 02:46:40. Ini adalah output yang benar-benar bisa diterima, tetapi jika kita menginginkan format yang lebih gampang dibaca, kita bisa menggunakan metode.strftime() untuk memberi kita string dalam format 'mm dd yyyy'.
Berikut adalah daftar lengkap code format yang bisa Anda gunakan dengan metode ini
Mari kita tes fungsinya dengan mencetak output selama 10.000 detik.
print(convertDate(10000))
Besar! Sekarang setelah fungsi convertDate() kami berfungsi, kami bisa mengerjakan skrip daging-dan-kentang, yang akan mengekstrak informasi file dari jalur yang diberikan.
Untuk informasi lebih lanjut tentang perpustakaan dan modul datetime, lihat dokumentasi resmi
Mengekstrak info file
Untuk mendapatkan info file dan direktori tertentu, kita akan menggunakan pustaka os dan berbagai metode yang disediakannya.
Terima jalur khusus atau default ke directory kerja saat ini. | |
Ambil jalan dan temukan tiap file di dalam direktori dan subdirektorinya. | |
Ekstrak nama, jalur, ukuran, dan tanggal pembuatan setiap file | |
Ambil info file dan masukkan ke kamus dan daftar. | |
Ambil daftar kamus itu dan ubah menjadi format JSON. |
Mari kita mulai dengan mendefinisikan fungsi getDirDetails() yang akan mengambil parameter path dan default ke direktori kerja saat ini.
Untuk mendapatkan direktori kerja saat ini, kita bisa menggunakan metode os.getcwd().
Tetapkan parameter jalur sama dengan cwd sebagai default dan tes fungsinya.
def getDirDetails(path=os.getcwd()):
return path
print(getDirDetails())
Hal pertama yang perlu kita lakukan ialah membuat beberapa variabel yang akan menentukan info bermanfaat mengenai jalur yang akan dilalui.
def getDirDetails(path=os.getcwd()):
fileList = []
pathExists = os.path.exists(path)
isFile = os.path.isfile(path)
isDir = os.path.isdir(path)
fileList = [] : Daftar kosong yang pada akhirnya akan menyimpan informasi file kita.
pathExists = os.path.exists(path) : Memeriksa apa jalur yang disediakan ada. Mengembalikan Benar atau Salah.
isFile = os.path.isFile(path) : Memeriksa apa jalur yang disediakan adalah File. Mengembalikan Benar atau Salah.
isDir = os.path.isDir(path) : Memeriksa apa jalur yang disediakan adalah Direktori. Mengembalikan Benar atau Salah.
Tiga yang terakhir akan membantu kita menangani kesalahan dan validasi. Penanganan kesalahan
Kami hanya ingin fungsi dijalankan jika jalur yang disediakan ada DAN adalah direktori. Jika jalur tidak ada atau mengarah ke file → beri pernyataan kesalahan. Kita bisa menggunakan beberapa pernyataan if-else untuk memeriksa tiap kasus.
def getDirDetails(path=os.getcwd()):
fileList = []
pathExists = os.path.exists(path)
isFile = os.path.isfile(path)
isDir = os.path.isdir(path)
if pathExists and isDir:
#do stuff
print(f"'{path}' is a directory.")
elif pathExists and isFile:
print(f"Error: The path '{path}' must be a directory.")
elif pathExists == False:
print(f"Error: The path '{path}' does not exist.")
#test it out
print(getDirDetails()) #cwd: should pass
print(getDirDetails("/Users/aaloktrivedi/package-lock.json")) #file: should fail
print(getDirDetails("/Users/sdsvdvd")) #invalid path: should fail
Fantastis! Penanganan kesalahan berfungsi seperti yang diharapkan.
CATATAN: Saya tahu python mempunyai metode penanganan kesalahan bawaan, jadi ini mungkin bukan cara terbaik untuk mengatasi validasi, tapi untuk tujuan kita, ini akan bekerja dengan baik.
Ulangi melalui direktori
Saat ini kami siap untuk mengulang lewat direktori kami untuk mendapatkan semua file. Salah satu cara kita bisa melakukannya dengan memanfaatkan metode os.walk(). Metode ini akan menghasilkan semua file dalam pohon direktori yang diberikan dan mengembalikan tuple (dirpath, dirname, nama file).
Kita bisa menggunakan for-loop untuk melakukan iterasi melalui tupel ini untuk mendapatkan informasi individual. Kami menginginkan jalur root: root, direktori: dirs , dan files: files
Kami kemudian ingin menggunakan for-loop lain untuk mengulang hanya melalui file untuk mendapatkan semua file individual.
def getDirDetails(path=os.getcwd()):
fileList = []
pathExists = os.path.exists(path)
isFile = os.path.isfile(path)
isDir = os.path.isdir(path)
if pathExists and isDir:
for root, dirs, files in os.walk(path):
for file in files:
print(file)
...
#outside of the function
getDirDetails("/Users/aaloktrivedi/LUIT/Projects/LUIT_python")
Sempurna! Kami sekarang memiliki akses ke setiap file, bahkan di dalam subdirektori.
Mari dapatkan lebih banyak informasi tentang file-file ini, seperti jalur, ukuran, dan tanggal pembuatan, dan simpan dalam variabel untuk digunakan nanti.
Untuk jalurnya, kita sebenarnya perlu menggunakan gabungan khusus di dalam metode os.path. Kami memiliki akses ke jalur root dan nama file secara terpisah, tetapi kami dapat menggunakan os.path.join() untuk menyatukannya kembali.
filePath = os.path.join(root, file)
Untuk ukuran file, kita dapat menggunakan metode os.path.getSize() , yang mengembalikan ukuran dalam byte. Sekali lagi, kita perlu melewati seluruh jalur, jadi kita dapat menggunakan variabel filePath yang baru saja kita buat.
#I divided the bytes by 1024 to convert it into kb (optional).
#remember you need to pass in the whole file path, not just the file name.
fileSize = round(os.path.getsize(filePath) / 1024, 1)
Ingat fungsi helper convertDate() yang kita buat sebelumnya? Saatnya menggunakannya untuk mengonversi tanggal pembuatan file kami. Kita dapat menggunakan metode os.path.getctime() untuk mendapatkan waktu dalam hitungan detik dan meneruskannya ke fungsi pembantu kita.
fileCreationDate = convertDate(os.path.getctime(filePath))
Sejauh ini, kode fungsi kita akan terlihat seperti ini:
def getDirDetails(path=os.getcwd()):
daftarberkas = []
pathExists = os.path.exists(jalur)
isFile = os.path.isfile(jalur)
isDir = os.jalur.isdir(jalur)
jika pathExists dan isDir:
untuk root, direktori, file di os.walk(path):
untuk file dalam file:
filePath = os.path.join(root, file)
fileSize = bulat(os.path.getsize(filePath) / 1024, 1)
fileCreationDate = convertDate(os.path.getctime(filePath))
elif pathExists dan isFile:
print(f"Kesalahan: Jalur '{path}' harus berupa direktori.")
elif pathExists == Salah:
print(f"Error: Path '{path}' tidak ada.")
Simpan data dan tambahkan ke daftar
Kami memiliki info file kami, jadi sekarang saatnya menyimpan data ini dalam kamus. Kami kemudian bisa menambahkan kamus ke fileList kosong yang kami buat.
#create a dict for each file
fileDict = {
'file_name': file,
'path': filePath,
'size_kb': fileSize,
"date_created": fileCreationDate
}
#append the dict to fileList
fileList.append(fileDict)
print(fileList)
Berhasil!… tapi ini tidak terlalu mudah dibaca. Mari kita konversi ke pola JSON untuk membuat data lebih ramah manusia. Kita bisa melakukannya dengan menggunakan metode json.dumps() (pastikan ini di luar for-loop).
pathFilesJSON = json.dumps(fileList, indent=4)
Terakhir, kami ingin mengembalikan data JSON (di luar for-loop). Ini memastikan fungsi mengeluarkan JSON setiap kali dipanggil.
return pathFilesJSON
#outside of the function
print(getDirDetails("YOUR_PATH")
Jauh lebih baik!
Selamat!
Kami baru saja berhasil membuat skrip python yang mengirimkan data pada setiap file di dalam direktori!
Ini code lengkapnya:
import os
import datetime
import json
# convert time to human readable format
def convertDate(timestamp):
d = datetime.datetime.utcfromtimestamp(timestamp)
formatedDate = d.strftime('%b %d, %Y')
return formatedDate
def getDirDetails(path=os.getcwd()):
fileList = []
pathExists = os.path.exists(path)
isFile = os.path.isfile(path)
isDir = os.path.isdir(path)
if pathExists and isDir:
for root, dirs, files in os.walk(path):
for file in files:
# get file path
filePath = os.path.join(root, file)
# get file size
fileSize = round(os.path.getsize(filePath) / 1024, 1)
# get and convert creation date
fileCreationDate = convertDate(os.path.getctime(filePath))
# add file details into a dict
fileDict = {
'file_name': file,
'path': filePath,
'size_kb': fileSize,
"date_created": fileCreationDate
}
# add file dicts into the list
fileList.append(fileDict)
# json of file
pathFilesJSON = json.dumps(fileList, indent=4)
return pathFilesJSON
elif pathExists and isFile:
print(f"Error: The path '{path}' must be a directory.")
elif pathExists == False:
print(f"Error: The path '{path}' does not exist.")
#call the function and print the results
print(getDirDetails("YOUR_PATH"))
Terima kasih
Terima kasih telah mengikuti saya dalam perjalanan komputasi awan saya. Saya harap artikel ini bermanfaat dan informatif. Tolong ikuti saya saat saya melanjutkan perjalanan saya, dan saya akan membagikan lebih banyak artikel seperti ini!
Artikel Terkait Lainnya :
- Belajar Kode Efisien Dan Mudah Dibaca Di Python
- 10 Pustaka Python untuk Pembelajaran Mesin yang Anda Butuhkan di Perangkat Anda
- Node.js Vs Python : Mana Yang Terbaik Untuk Pengembangan Backend Di Tahun 2023?
- Memecahkan Actorle dengan Python
- 10 Tips Memaksimalkan Produktivitas Anda Sebagai Developer Python