„Python“ sąrašo failai katalogų vadove - „listdir VS“ sistema („ls“), paaiškinta pavyzdžiais

? Sveiki

Jei norite sužinoti, kaip šios funkcijos veikia užkulisiuose ir kaip galite išnaudoti visas jų galimybes, šis straipsnis skirtas jums.

Pradėsime pasinerdami į sąvokas, kurios yra būtinos norint dirbti listdirir system:

  • Integruotas „Python“ osmodulis ir kaip jį importuoti.
  • Sąvokos „katalogas“ ir „dabartinis darbo katalogas“.
  • Kaip patikrinti ir pakeisti dabartinį darbo katalogą.
  • Skirtumas tarp absoliutaus kelio ir santykinio kelio.

Tada mes pasinersime į pačias funkcijas:

  • Kaip dirbti su listdirfunkcija ir kada ją naudoti.
  • Kaip dirbti su system("ls")funkcija ir kada ją naudoti.
  • Jų abiejų ir jų užkulisių pavyzdžiai.

Pradėkime! ⭐

? OS modulis

Dvi funkcijos, kurias aptarsime: listdir()ir system()priklauso osmoduliui. Šis modulis apima funkcijas, kurios naudojamos sąveikai su jūsų operacine sistema, atliekant tokius veiksmus:

  • Naujo katalogo kūrimas.
  • Esamo katalogo pervadinimas.
  • Katalogo pašalinimas.
  • Rodomas kelias į dabartinį darbo katalogą.
  • Daug daugiau!

? Patarimai:

  • Katalogas yra tai, ką mes paprastai žinome, kaip "aplanke", kur mes paprastai saugoti susijusius failus ir / ar kitus katalogus, sukurti katalogų hierarchiją kataloguose, kurie yra vadinami pakatalogius. Katalogo pavyzdys yra aplankas „Dokumentai“.
  • Modulis yra failas, kuriame yra susijusios Python kodą.

Kaip importuoti OS modulį

Norėdami naudoti osmodulį savo scenarijuje, turite jį „importuoti“. Importuoti modulį reiškia gauti prieigą prie visų modulio saugomų funkcijų ir kintamųjų. Importuojame modulį, kai norime jo kodą naudoti scenarijuje.

Norėdami importuoti osmodulį, paprasčiausiai turite įtraukti šią eilutę į „Python“ scenarijaus viršuje arba paleisti šią eilutę į interaktyvų apvalkalą:

import os

Tai suteiks jums prieigą prie visų osmodulyje apibrėžtų funkcijų .

? Patarimas: šis modulis jau buvo įdiegtas, kai įdiegėte „Python 3“, todėl galėsite jį naudoti iš karto.

Kad galėtumėte naudoti osmodulio os.funkcijas, prieš norimos iškviesti funkcijos pavadinimą turėsite pridėti priešdėlį :

os.()

Pavyzdžiui:

os.mkdir("New Folder")

Kaip importuoti atskiras funkcijas

Jei dirbate tik su viena ar dviem modulio funkcijomis, galite jas importuoti atskirai naudodami šią sintaksę:

from  import , , ...

Pavyzdžiui:

from os import listdir, system

Tokiu atveju, galite skambinti į savo scenarijų funkcijas, kaip paprastai, be pridedant os.priešdėlį, pavyzdžiui:

()

Pavyzdžiui:

mkdir("New Folder")

? Dabartinis darbo katalogas

Dabar pažiūrėkime labai svarbią koncepciją, kurią turite žinoti prieš pradėdami dirbti su listdirir system. Dabartinis jūsų darbo katalogas, kaip rodo pavadinimas, yra katalogas (aplankas), kuriame šiuo metu dirbate.

Naudodamiesi šia funkcija, galite patikrinti savo dabartinį darbo katalogą iš osmodulio:

os.getcwd()

Tai parodys kelią į dabartinį darbo katalogą.

? Patarimas:cwd reiškia „dabartinį darbo katalogą“.

Iš interaktyvios kriauklės

Jei vykdau šią komandą interaktyviame apvalkale („Windows“), matau:

>>> os.getcwd() 'C:\\Users\\estef\\AppData\\Local\\Programs\\Python\\Python38-32'

Tai yra visas kelias į dabartinį mano darbo katalogą:

'C:\\Users\\estef\\AppData\\Local\\Programs\\Python\\Python38-32'

Iš scenarijaus

Jei vykdau šią komandą iš scenarijaus, taip:

import os print(os.getcwd())

Matau:

C:\Users\estef\Documents\freeCodeCamp\freeCodeCamp News\listdir vs system

Visas kelias į scenarijų (jo vieta sistemoje, katalogų hierarchijoje).

? Patarimas: Jei vykdote scenarijų („Python“ failą), dabartinis jūsų darbo katalogas yra katalogas, kuriame šiuo metu yra scenarijus.

Kaip pakeisti dabartinį darbo katalogą

Galite pakeisti dabartinį darbo katalogą naudodami šią komandą iš osmodulio:

os.chdir()

Turėsite nurodyti kelią į naują darbo katalogą, perduodami jį kaip argumentą, suformatuotą kaip eilutę. Tai gali būti absoliutus kelias arba santykinis kelias.

? Patarimas:

  • An absolute path specifies all the sequence of directories that you need to go through to reach your target directory. This path starts from the root directory of your system.

For example:

>>> import os >>> os.chdir(r"C:\Users\estef\Documents\FreeCodeCamp\freeCodeCamp News\9 - listdir vs system") # Checking current working directory: >>> os.getcwd() 'C:\\Users\\estef\\Documents\\FreeCodeCamp\\freeCodeCamp News\\9 - listdir vs system'

Notice that I added an r before the absolute path to convert the string into a raw string. If you use \ and you don't add the r, you will get an error because the \ symbol will be treated as a special character.

Alternatively, you could replace the backslashes  \ with forward slashes / in the path:

>>> os.chdir("C:/Users/estef/Documents/FreeCodeCamp/freeCodeCamp News/9 - listdir vs system") # Checking current working directory >>> os.getcwd() 'C:\\Users\\estef\\Documents\\FreeCodeCamp\\freeCodeCamp News\\9 - listdir vs system'
  • A relative path specifies the path that you want to follow to find the target directory, but now the path starts from your current working directory. It's shorter and simpler than the absolute path.

For example, if your current working directory contains a subdirectory (folder) Directory 1, you can move to this directory using a relative path (imagine it as a folder within another folder, and we are going deeper and deeper into the hierarchy), like this:

>>> import os >>> os.chdir(".\Directory 1") # Check current working directory >>> os.getcwd() 'C:\\Users\\estef\\Documents\\FreeCodeCamp\\freeCodeCamp News\\9 - listdir vs system\\Directory 1'

? Tip: The dot (.) at the beginning of the relative path .\Directory 1 represents the current working directory. A double dot ( ..) is used to move up the hierarchy, to the "parent" directory.

Dabar, kai turite visas pagrindines žinias, kurių jums reikės norint suprasti, kaip listdirir kaip systemdirbti, pažiūrėkime jas išsamiai.

? „Listdir“

Pradėsime nuo listdirfunkcijos. Atskleiskime jo paslaptis. ?

Tikslas ir grąžinimo vertė

Pagal „Python“ dokumentaciją, šios funkcijos tikslas yra:

Grąžinkite sąrašą, kuriame yra kelio nurodytų katalogo įrašų pavadinimai .

Iš esmės ši funkcija grąžina sąrašą visų failų ir katalogų, kurie šiuo metu yra tam tikrame kataloge, kuriuos nurodote iškvietę funkciją, pavadinimai.

? Patarimas: Sąraše nebus konkrečios tvarkos, net jei elementus paprastai rūšiuojate abėcėlės tvarka.

Sintaksė ir parametras

To call listdir, will need to use this syntax:

The parameter path is precisely that, the absolute or relative path to the directory that you want to visualize. In Python 3.2 and above, this parameter is optional. By default, the path will lead to your current working directory if you don't pass an argument.

Remember that you must import the os module before calling this function.

? Tip: If you use this import statement from os import listdir to import the function individually, you can omit the os. prefix, like this:

Use Cases and Advantages

The function listdir is very helpful because it works on any operating system where Python runs, so if Python is installed on your device, this function will work correctly.

Now let's talk a little bit about its return value. Since it returns a list, we can store this list in a variable and work with it in our program.

For example, let's say that we want to do something with all the files from a given directory, such as converting images to black and white or modifying their content. We could do it using a for loop, like this:

images = os.listdir() for image in images: # Do something to the image 

Of course, you would need to define what happens within the loop, but this is an example of what you could do with this function.

This is awesome, right?

But having files and directories in the same list can be a little bit problematic if we want to work with a for loop, right? We would need to add a conditional to check the type of each element. How can we make a list that only contains file names (no directories) or vice versa?

Let's see! ✨

Only Include Files

If you want to "filter" the list returned by os.listdir() to include only files (no directories) you can use this line of code:

list(filter(os.path.isfile, os.listdir()))

? Tip: You can customize the argument or omit it to use your current working directory.

Let's see an example with my current working directory (I'm using Windows):

My directory (folder) has:

  • Two subdirectories (folders within the main folder)
  • One PowerPoint file
  • One image (.png file)
  • One Python script

If I call the listdir function from the script.py file and print the list returned:

print(os.listdir())

This is the output:

['Diagrams.ppt', 'Directory 1', 'Directory 2', 'listdir vs system.png', 'script.py']

You can see that all files and directories from my current working directory were included.

To filter the list to only contain files, we can use this statement:

print(list(filter(os.path.isfile, os.listdir())))

Now the output is:

['Diagrams.ppt', 'listdir vs system.png', 'script.py']

Notice how the directories were "filtered", exactly what we wanted.

Only Include Directories

Similarly, if you want to "filter" the list to include only directories, you can use this line of code:

list(filter(os.path.isdir, os.listdir()))

Now the output is:

['Directory 1', 'Directory 2']

Exactly what we wanted. But how does this statement work behind the scenes? Let's see.

How filter() Works Behind the Scenes

The filter function is called using this syntax:

filter(, )

It basically "filters" the elements of the second argument (the list) based on the truth value returned by calling the function passed as the first argument (os.path.isfile() or os.path.isdir() in their respective commands):

print(list(filter(os.path.isfile, os.listdir())))
list(filter(os.path.isdir, os.listdir()))

These two functions:

os.path.isfile() os.path.isdir()

Return True if the argument is a file or a directory, respectively.  

Based on these truth values, the elements of the list will be included (or not) in the final "filtered" list. The elements of the list returned by os.listdir() are passed one by one to these functions to check if they are files (or directories, respectively).

For example: If we have this line of code:

filter(os.path.isfile, os.listdir())))

And os.listdir() returns this list:

['Diagrams.ppt', 'Directory 1', 'Directory 2', 'script.py']

The first element of the list ('Diagrams.ppt') is passed as argument to os.path.isfile() to check if it's a file :

os.path.isfile('Diagrams.ppt') # True

The function call returns True, so it's a file and it's included in the list.

But if the element is a directory:

os.path.isfile('Directory 1') # False

The function call returns False, so it's not included in the list. This process continues for every element in the list until the new list only contains file names.

Nuo tada, kai filter()pateikia iterable, mes sudarome sąrašą iš iterable naudojant list():

list(filter(os.path.isfile, os.listdir()))

Ir atsispausdiname, nes dirbame su „Python“ failu (scenarijumi):

print(list(filter(os.path.isfile, os.listdir())))

? Patarimas: Galite vizualiai nustatyti, ar sąrašo elementas žymi failą ar katalogą, pažiūrėdami, ar po jo pavadinimo jis turi plėtinį (tipą). Pvz .: Diagrams.pptturi .pptplėtinį, nurodantį, kad tai „PowerPoint“ failas, bet kataloge nėra plėtinio, pvz 'Directory 1'.

? sistema („ls“)

Dabar, kai žinote, kaip dirbti listdir, pažiūrėkime, kaip system()funkcija veikia užkulisiuose ir kaip galite ją naudoti.

Tikslas

Pagal „Python“ dokumentaciją system()funkcijos paskirtis yra:

Vykdykite komandą (eilutę) antriniame apvalkale

Basically, this function takes a command (as a string) and executes it.

In this case, the command that we are passing is 'ls' , a Unix command used in Linux to display the content of a directory as standard output.

Unlike listdir, the system() function will not return a list if we pass the 'ls' command, it will only display the list of files and directories as standard output. Therefore, you should use it if you only want to visualize the list without actually working with it in your program.

Syntax and Parameter

To call this function, you will need to use this syntax:

Its only argument is the command that you want to execute formatted as a string (surrounded by double quotes or single quotes).

Particularly, the ls command lets you see the content of your current working directory.

For example: if this is my working directory (three Python files and one subdirectory):

And I call the system() function, like this:

>>> import os >>> os.system("ls")

This is the output:

'Directory 1' 'file 1.py' 'file 2.py' main.py 0

We can see the standard output in the console (the list of files and directories):

'Directory 1' 'file 1.py' 'file 2.py' main.py

and the return value:

0

? Note: For these examples of the system() function, I'm working with an online command line tool called Repl.it since my computer has Windows installed and the command ls is not recognized by the default command prompt.

Limitations

One of the main limitation of this function is that the command passed as argument has to be recognized by the operating system or environment that you are working with.

Pavyzdžiui, lskomanda nebus atpažinta sistemoje „Windows“ komandų eilutėje. Šią klaidą pamatysite, jei bandysite ją paleisti:

„ls“ nėra atpažįstamas kaip vidinė ar išorinė komanda, valdoma programa ar paketinis failas.

Panaši „Windows“ 'dir'komanda būtų komanda:

os.system('dir')

? Patarimas: Yra kitų būdų, kaip paleisti lskomandą sistemoje „Windows“, pavyzdžiui, naudojant terminalo programas, kurios atpažįsta „Unix“ komandas, tačiau pagal numatytuosius nustatymus „Windows“ 'ls'komandos neatpažįsta .

Grąžinimo vertė

Pagal „Python“ dokumentaciją:

„Unix“ grąžinama reikšmė yra proceso išėjimo būsena, užkoduota nurodytu formatu wait().

ir ...

„Windows“ sistemoje grąžinimo vertė yra ta, kurią grąžina sistemos apvalkalas paleidus komandą .

? Patarimas: Atkreipkite dėmesį, kad ši funkcija negrąžina sąrašą. Paprasčiausiai sąrašas pateikiamas kaip standartinė išvestis, todėl negalite jo laikyti kintamajame, kaip jūs darėte listdir.

Variacijos lskomandą

Pagrindinis bruožas yra os.system('ls')tai, kad jame yra daug naudingų ir įdomių galimybių pritaikyti, kaip pateikti išvestį. Pažiūrėkime keletą jų.

1 variantas: naudodami komandą galime parodyti daugiau informacijos apie failus ir katalogus, pvz., Jų dydį, vietą, modifikavimo datą ir laiką ls -l.

>>> import os >>> os.system('ls -l') total 12 drwxr-xr-x 1 runner runner 0 Apr 3 18:23 'Directory 1' -rw-r--r-- 1 runner runner 11 Apr 3 18:38 'file 1.py' -rw-r--r-- 1 runner runner 11 Apr 3 18:38 'file 2.py' -rw-r--r-- 1 runner runner 11 Apr 3 18:38 main.py 0

Option 2: To be able to visually recognize directories faster, we can use ls -F, which adds a forward slash / to the end of their names (see 'Directory 1/' below).

>>> import os >>> os.system('ls -F') 'Directory 1'/ 'file 1.py' 'file 2.py' main.py 0

Option 3: To sort the files by size, we can use the command ls -lS.

>>> import os >>> os.system('ls -lS') total 12 -rw-r--r-- 1 runner runner 11 Apr 3 18:38 'file 1.py' -rw-r--r-- 1 runner runner 11 Apr 3 18:38 'file 2.py' -rw-r--r-- 1 runner runner 11 Apr 3 18:38 main.py drwxr-xr-x 1 runner runner 0 Apr 3 18:23 'Directory 1' 0

There are many more options for customization that can be helpful for your particular goal. Here you can find more information about the -ls command and how you can use its full power.

? Summary of listdir vs. system("ls")

  • Purpose:listdir returns the list of file names and directories in the path specified (by default, the current working directory) while system("ls") only displays them as standard output.
  • Operacinė sistema:listdir gali būti naudojama nepriklausomai nuo operacinės sistemos, su kuria dirbate. Priešingai, system('ls')jis turi būti vykdomas operacinėje sistemoje ar aplinkoje, kuri atpažįsta 'ls'komandą.
  • Tinkinimas: galite filtruoti grąžintą sąrašą, listdirjei naudodami filter()funkciją turite pašalinti failus ar katalogus ir galite perduoti parinktis, kad pritaikytumėte išvestį system('ls').

Labai tikiuosi, kad jums patiko mano straipsnis ir jis buvo naudingas. Dabar galite dirbti su šiomis funkcijomis savo „Python“ projektuose. Peržiūrėkite mano internetinius kursus. Sekite mane „Twitter“. ⭐️