Saat ini saya melakukan manipulasi file teks saya melalui sekelompok AWK, sed, Bash dan sedikit Perl.
Saya telah melihat menyebutkan beberapa tempat bahwa python baik untuk hal semacam ini. Bagaimana saya bisa menggunakan Python untuk mengganti skrip shell, AWK, sed dan teman-teman?
Jawaban:
Setiap shell memiliki beberapa set fitur.
Perintah Essential Linux / Unix. Semua ini tersedia melalui perpustakaan subproses . Ini tidak selalu merupakan pilihan pertama terbaik untuk melakukan semua perintah eksternal. Lihat juga di shutil untuk beberapa perintah yang merupakan perintah Linux yang terpisah, tetapi Anda mungkin bisa mengimplementasikannya langsung di skrip Python Anda. Sejumlah besar perintah Linux ada di perpustakaan os ; Anda dapat melakukan ini lebih sederhana dengan Python.
Dan - bonus! -- lebih cepat. Setiap perintah Linux yang terpisah di shell (dengan beberapa pengecualian) bercabang menjadi subproses. Dengan menggunakan Python
shutil
danos
modul, Anda tidak perlu melakukan subproses.Fitur lingkungan shell. Ini termasuk hal-hal yang menetapkan lingkungan perintah (direktori saat ini dan variabel lingkungan dan apa-tidak). Anda dapat dengan mudah mengelola ini dari Python secara langsung.
Fitur pemrograman shell. Ini semua proses kode status memeriksa, berbagai perintah logika (jika, sementara, untuk, dll) perintah uji dan semua kerabat itu. Hal-hal definisi fungsi. Ini semua, jauh lebih mudah dengan Python. Ini adalah salah satu kemenangan besar dalam menyingkirkan bash dan melakukannya dengan Python.
Fitur interaksi. Ini termasuk sejarah perintah dan apa yang tidak. Anda tidak memerlukan ini untuk menulis skrip shell. Ini hanya untuk interaksi manusia, dan bukan untuk penulisan naskah.
Fitur manajemen file shell. Ini termasuk pengalihan dan jalur pipa. Ini lebih sulit. Banyak dari ini dapat dilakukan dengan subproses. Tetapi beberapa hal yang mudah di shell tidak menyenangkan di Python. Khususnya hal-hal seperti
(a | b; c ) | something >result
. Ini menjalankan dua proses secara paralel (dengan outputa
sebagai input keb
), diikuti oleh proses ketiga. Output dari urutan itu dijalankan secara paralel dengansomething
dan output dikumpulkan ke file bernamaresult
. Itu kompleks untuk diekspresikan dalam bahasa lain.Program spesifik (awk, sed, grep, dll.) Seringkali dapat ditulis ulang sebagai modul Python. Jangan berlebihan. Ganti apa yang Anda butuhkan dan kembangkan modul "grep" Anda. Jangan mulai menulis modul Python yang menggantikan "grep".
Yang terbaik adalah Anda bisa melakukan ini dalam langkah-langkah.
os.walk
. Ini adalah kemenangan besar karena Anda tidak menelurkan banyak proses.sumber
find
skrip yang saya miliki jelek dan panjang dan tidak dapat dibandingkan. Banyak hal yang harus berupa skrip shell, banyak lainnya tidak . Tidak semuanya perlu hanya satu dari Python atau BASH (atau apa pun).(a | b; c ) | something >result
) agak dimitigasi olehnya karena mudah untuk melewati pipeline shell kesubprocess
metode menggunakanshell=True
Ya tentu saja :)
Lihatlah perpustakaan-perpustakaan ini yang membantu Anda Jangan pernah menulis skrip shell lagi (moto Plumbum).
Juga, jika Anda ingin mengganti awk, sed dan grep dengan sesuatu yang berbasis Python maka saya sarankan pyp -
sumber
Saya baru saja menemukan cara menggabungkan bagian terbaik dari bash dan ipython. Sampai sekarang ini terasa lebih nyaman bagi saya daripada menggunakan subproses dan sebagainya. Anda dapat dengan mudah menyalin sebagian besar skrip bash yang ada dan misalnya menambahkan penanganan kesalahan dengan cara python :) Dan inilah hasil saya:
Lihat dokumen IPython pada perintah shell sistem dan menggunakannya sebagai shell sistem .
sumber
filelines = ! cat myfile
$var
pada perintah shell? Wow. Ini harus menjadi jawaban yang diterima.Pada tahun 2015 dan rilis Python 3.4, sekarang ada shell interaktif-pengguna yang cukup lengkap tersedia di: http://xon.sh/ atau https://github.com/scopatz/xonsh
The video demonstrasi tidak menunjukkan pipa yang digunakan, tetapi mereka ADALAH didukung saat dalam modus shell default.
Xonsh ('Keong') berusaha sangat keras untuk menandingi bash, jadi hal-hal yang sudah Anda dapatkan, misalnya
atau
masih akan bekerja dengan baik.
Tutorialnya cukup panjang dan tampaknya mencakup sejumlah besar fungsi yang biasanya diharapkan seseorang pada prompt ash atau bash:
?
&??
*.xsh
Skrip yang juga dapat diimpor${}
$()
, Subproses yang tidak dibaptis dengan$[]
, Evaluasi Python dengan@()
*
atau Ekspresi Reguler Nama file Globbing dengan Backtickssumber
.xsh
ekstensi untuk file dengan kode xonsh : github.com/xonsh/xonsh/issues/2478 . Kalau tidak, Anda harus menggunakannyaevalx
untuk memanggilnya langsung dari.py
file.sumber
Pada awalnya ada sh, sed, dan awk (dan temukan, dan grep, dan ...). Itu bagus. Tetapi awk bisa menjadi binatang kecil yang aneh dan sulit diingat jika Anda tidak sering menggunakannya. Kemudian unta besar menciptakan Perl. Perl adalah impian administrator sistem. Itu seperti skrip shell pada steroid. Pemrosesan teks, termasuk ekspresi reguler hanya bagian dari bahasa. Kemudian menjadi jelek ... Orang-orang mencoba membuat aplikasi besar dengan Perl. Sekarang, jangan salah paham, Perl bisa menjadi aplikasi, tetapi bisa (bisa!) Terlihat berantakan jika Anda tidak benar-benar berhati-hati. Lalu ada semua bisnis data flat ini. Sudah cukup untuk menggerakkan kacang programmer.
Masukkan Python, Ruby, dkk. Ini adalah bahasa tujuan umum yang sangat bagus. Mereka mendukung pemrosesan teks, dan melakukannya dengan baik (meskipun mungkin tidak terjalin erat dalam inti dasar bahasa). Tetapi mereka juga meningkatkan skala dengan baik, dan masih memiliki kode yang terlihat bagus di akhir hari. Mereka juga telah mengembangkan komunitas yang cukup besar dengan banyak perpustakaan untuk hampir semua hal.
Sekarang, banyak dari ketidak-adilan terhadap Perl adalah masalah pendapat, dan tentu saja beberapa orang dapat menulis Perl sangat bersih, tetapi dengan ini banyak orang mengeluh tentang hal itu karena terlalu mudah untuk membuat kode yang dikaburkan, Anda tahu ada beberapa butir kebenaran di sana. Pertanyaannya adalah, apakah Anda akan menggunakan bahasa ini untuk lebih dari sekadar penggantian skrip bash. Jika tidak, pelajari lebih banyak Perl .. itu benar-benar fantastis untuk itu. Di lain pihak, jika Anda menginginkan bahasa yang akan berkembang seiring Anda ingin melakukan lebih banyak, boleh saya sarankan Python atau Ruby.
Either way, semoga berhasil!
sumber
Saya menyarankan buku online yang luar biasa Dive Into Python . Begitulah cara saya mempelajari bahasa aslinya.
Selain mengajari Anda struktur dasar bahasa, dan banyak sekali struktur data yang bermanfaat, ia memiliki bab yang baik tentang penanganan file dan bab-bab selanjutnya tentang ekspresi reguler dan banyak lagi.
sumber
Menambah jawaban sebelumnya: periksa modul pexpect untuk berurusan dengan perintah interaktif (adduser, passwd dll.)
sumber
Salah satu alasan saya suka Python adalah karena standarnya jauh lebih baik daripada alat POSIX. Saya harus memeriksa dua kali dan tiga kali lipat bahwa setiap bit kompatibel dengan sistem operasi lain. Program yang ditulis pada sistem Linux mungkin tidak berfungsi sama pada sistem BSD OSX. Dengan Python, saya hanya perlu memeriksa bahwa sistem target memiliki versi Python yang cukup modern.
Bahkan lebih baik, program yang ditulis dengan Python standar bahkan akan berjalan di Windows!
sumber
Di sini saya akan memberikan pendapat saya berdasarkan pengalaman:
Untuk shell:
Untuk python:
Saya biasanya memilih bash untuk sebagian besar hal, tetapi ketika saya memiliki sesuatu yang harus melewati batas windows, saya hanya menggunakan python.
sumber
pythonpy adalah alat yang menyediakan akses mudah ke banyak fitur dari awk dan sed, tetapi menggunakan sintaksis python:
sumber
Saya telah membangun skrip shell semi-panjang (300-500 baris) dan kode Python yang melakukan fungsi serupa. Ketika banyak perintah eksternal dieksekusi, saya menemukan shell lebih mudah digunakan. Perl juga merupakan pilihan yang baik ketika ada banyak manipulasi teks.
sumber
Saat meneliti topik ini, saya menemukan kode pembuktian konsep ini (melalui komentar di http://jlebar.com/2010/2/1/Replacing_Bash.html ) yang memungkinkan Anda "menulis pipeline mirip shell di Python menggunakan sintaks singkat, dan meningkatkan alat sistem yang ada di mana mereka masuk akal ":
sumber
Taruhan terbaik Anda adalah alat yang secara khusus diarahkan untuk masalah Anda. Jika sedang memproses file teks, maka Sed, Awk, dan Perl adalah pesaing teratas. Python adalah bahasa dinamis tujuan umum . Seperti halnya bahasa tujuan umum, ada dukungan untuk manipulasi file, tetapi bukan itu tujuan intinya. Saya akan mempertimbangkan Python atau Ruby jika saya memiliki persyaratan untuk bahasa yang dinamis pada khususnya.
Singkatnya, pelajari Sed dan Awk dengan sangat baik, ditambah semua barang lain yang datang dengan citarasa * nix Anda (Semua bawaan Bash, grep, tr, dan sebagainya). Jika Anda memproses file teks yang Anda minati, Anda sudah menggunakan hal-hal yang benar.
sumber
Anda bisa menggunakan python alih-alih bash dengan pustaka ShellPy .
Berikut adalah contoh yang mengunduh avatar pengguna Python dari Github:
Seperti yang Anda lihat, semua ekspresi di dalam simbol aksen kubur (`) dieksekusi di shell. Dan dalam kode Python, Anda dapat menangkap hasil dari eksekusi ini dan melakukan tindakan di atasnya. Sebagai contoh:
Baris ini pertama-tama akan mengeksekusi
git log --pretty=oneline --grep='Create'
di shell dan kemudian menetapkan hasilnya ke variabel log. Hasilnya memiliki sifat-sifat berikut:stdout seluruh teks dari stdout dari proses yang dieksekusi
stderr seluruh teks dari stderr dari proses yang dieksekusi
returncode returncode dari eksekusi
Ini adalah gambaran umum dari perpustakaan, deskripsi yang lebih rinci dengan contoh-contoh dapat ditemukan di sini .
sumber
Jika manipulasi file teks Anda biasanya satu kali, mungkin dilakukan pada prompt shell, Anda tidak akan mendapatkan sesuatu yang lebih baik dari python.
Di sisi lain, jika Anda biasanya harus melakukan tugas yang sama (atau serupa) berulang kali, dan Anda harus menulis skrip Anda untuk melakukan itu, maka python hebat - dan Anda dapat dengan mudah membuat perpustakaan Anda sendiri (Anda dapat melakukan itu dengan skrip shell juga, tetapi lebih rumit).
Contoh yang sangat sederhana untuk mendapatkan perasaan.
Periksa juga sys dan modul getopt, mereka adalah yang pertama yang Anda perlukan.
sumber
Saya telah menerbitkan paket tentang PyPI: ez .
Gunakan
pip install ez
untuk menginstalnya.Ini telah mengemas perintah-perintah umum dalam shell dan lib saya menggunakan sintaksis yang sama seperti shell. misalnya, cp (sumber, tujuan) dapat menangani file dan folder! (pembungkus shutil.copy shutil.copytree dan memutuskan kapan harus menggunakan yang mana). Lebih bagus lagi, ini dapat mendukung vektorisasi seperti R!
Contoh lain: tanpa os.walk, gunakan fls (path, regex) untuk secara rekursif menemukan file dan memfilter dengan ekspresi reguler dan mengembalikan daftar file dengan atau tanpa fullpath
Contoh terakhir: Anda dapat menggabungkannya untuk menulis skrip yang sangat sederhana:
files = fls('.','py$'); cp(files, myDir)
Pasti memeriksanya! Saya harus menghabiskan ratusan jam untuk menulis / memperbaikinya!
sumber