පයිතන් හි නාමාවලිය තිබේදැයි සොයා ගන්නේ කෙසේද


1160

තුළ osPython දී මොඩියුලය, නාමාවලියක් පවතී නම් සොයා ගැනීමට වගේ දෙයක් ක්රමයක් ඇත:

>>> os.direxists(os.path.join(os.getcwd()), 'new_folder')) # in pseudocode
True/False

9
අනතුරු ඇඟවීමේ වචනයක් - ඉහළම ශ්‍රේණිගත කළ පිළිතුර ජාතියේ තත්වයන්ට ගොදුරු විය හැකිය. os.statඩිරෙක්ටරිය දෙකම පවතින්නේද සහ එකම මොහොතේ ඩිරෙක්ටරියක්ද යන්න බැලීමට ඔබට ඒ වෙනුවට ක්‍රියා කිරීමට අවශ්‍ය විය හැකිය .
d33tah

2
33 d33tah ඔබට හොඳ කරුණක් තිබිය හැකි නමුත් os.statගොනුවකින් නාමාවලිය පැවසීමට භාවිතා කළ හැකි ක්‍රමයක් මා දකින්නේ නැත . OSErrorගොනුව හෝ ඩිරෙක්ටරිය වේවා, මාර්ගය අවලංගු වූ විට එය මතු වේ. එසේම, පරීක්ෂා කිරීමෙන් පසු ඕනෑම කේතයක් ධාවන තත්වයන්ට ගොදුරු වේ.
ටොමේ සැටෝ - මොනිකා නැවත

4
@ ටොම්සැටෝ: මෙහෙයුම සිදු කිරීම සහ දෝෂ හැසිරවීම ආරක්ෂිත බව නිගමනයකට එළඹේ.
d33tah

2
@ David542 “isdir” “පවතී” සඳහා නිරවද්‍යතාව සඳහා පරීක්ෂණ සමඟ පැහැදිලි කිරීමේ නඩුවක් එක් කළෙමි. මම හිතන්නේ ඔබ දැන් ඕනෑම දෙයක් ඉගෙන ගනීවි. නමුත් එය නව පුද්ගලයින් ආලෝකමත් කළ හැකිය.
GeoStoneMarten

Answers:


1750

ඔබ සොයන්නේ os.path.isdir, හෝ os.path.existsඑය ගොනුවක් හෝ නාමාවලියක් දැයි ඔබට ප්‍රශ්නයක් නැත්නම්.

උදාහරණයක්:

import os
print(os.path.isdir("/home/el"))
print(os.path.exists("/home/el/myfile.txt"))

4
ysyedrakib වස්තුවක් කැඳවිය හැකි බව දැක්වීමට වරහන් වර්‍ග භාවිතා කළ හැකි නමුත් පන්තිවල පවා ඇමතිය හැකි බැවින් එය පයිතන්හි ප්‍රයෝජනවත් නොවේ. එසේම, කාර්යයන් පයිතන් හි පළමු පන්තියේ අගයන් වන අතර, වරහන් existing = filter(os.path.isdir(['/lib', '/usr/lib', '/usr/local/lib'])
වර්‍ගයකින්

10
ඔබට වෙනත් කාර්යයන් සඳහා ශ්‍රිතයන් යැවිය හැකිය map, නමුත් සාමාන්‍යයෙන්, ඔබ තර්ක හා වරහන් සමඟ ශ්‍රිත අමතයි. එසේම, ඔබේ උදාහරණයේ යම් අක්ෂර වින්‍යාසයක් ඇත. අනුමාන වශයෙන් ඔබ අදහස් කළේ filter(os.path.isdir, ['/lib', '/usr/lib', '/usr/local/lib']).
hughdbrown

5
එසේම, os.path.isfile(path)එය ගොනුවක්ද යන්න ගැන ඔබ සැලකිලිමත් වන්නේ නම් පමණි.
නිකලස්

2
සමහර වේදිකාවල ගොනුව / නාමාවලිය පවතින්නේ නම් මේවා ව්‍යාජ ලෙස නැවත පැමිණෙන බව මතක තබා ගන්න, නමුත් කියවීමේ අවසර දෝෂයක් ද සිදු වේ.
cowlinator

78

එතරම් සමීපයි! ඔබ දැනට පවතින නාමාවලියක නාමයෙන් සමත් වුවහොත් os.path.isdirනැවත පැමිණේ True. එය නොපවතී නම් හෝ එය නාමාවලියක් නොවේ නම්, එය නැවත පැමිණේ False.


76

පයිතන් 3.4 මොඩියුලය සම්මත පුස්තකාලයට හඳුන්වා දුන් අතරpathlib එය ගොනු පද්ධති මාර්ග හැසිරවීමට වස්තු නැඹුරු ප්‍රවේශයක් සපයයි. මෙම is_dir()සහ exists()එය ක්රම Pathඒ සඳහා පිළිතුරු දීමට වස්තුව භාවිතා කල හැක:

In [1]: from pathlib import Path

In [2]: p = Path('/usr')

In [3]: p.exists()
Out[3]: True

In [4]: p.is_dir()
Out[4]: True

/ක්‍රියාකරු සමඟ මාර්ග (සහ නූල්) සම්බන්ධ කළ හැකිය :

In [5]: q = p / 'bin' / 'vim'

In [6]: q
Out[6]: PosixPath('/usr/bin/vim') 

In [7]: q.exists()
Out[7]: True

In [8]: q.is_dir()
Out[8]: False

පැත්ලිබ් පයිතන් 2.7 හි පයිප්හි පාත්ලිබ් 2 මොඩියුලය හරහා ලබා ගත හැකිය .


සමහර පැහැදිලි කිරීම් ප්‍රයෝජනවත් වනු ඇත. ඇයි ඔයා කරන්නේ p / 'bin' / 'vim'? ”
නේතන්

1
ranfrank මම පිළිතුරේ දෙවන කොටස ගැන ටිකක් විස්තර කළෙමි.
joelostblom

35

ඔව්, භාවිතා කරන්න os.path.exists().


24
මාර්ගය නාමාවලියක් බව එය පරීක්ෂා නොකරයි.
කිර්ක් ස්ට්‍රෝසර්

7
හොඳ ඇමතුමක්. තවත් සමහරු පෙන්වා දී ඇත්තේ os.path.isdirඑය ඉටු වනු ඇති බවයි.
aganders3

3
මෙය ප්‍රශ්නයට පිළිතුරු නොදෙන බව ඔබ තේරුම් ගන්නේ නම්, ඔබ පිළිතුර ඉවත් නොකරන්නේ ඇයි?

3
Am කැමිල්ස්ටැප්ස් මෙම ප්‍රශ්නය 354000 වතාවක් නරඹා ඇත (මේ වන විට). මෙහි පිළිතුරු OP සඳහා පමණක් නොවේ, ඒවා ඕනෑම හේතුවක් නිසා මෙහි පැමිණිය හැකි ඕනෑම අයෙකුට ය. OP හි ගැටළුව කෙලින්ම විසඳන්නේ නැතත් aganders3 හි පිළිතුර අදාළ වේ.
ගේබ්‍රියෙල්

4
Ab ගේබ්‍රියෙල් එවිට මෙය සැබවින්ම කරන්නේ කුමක්ද යන්න පිළිතුරෙන් පැහැදිලි කළ යුතුය.

22

ගොඩනඟන ලද කාර්යයන් 2 ක් සමඟ අපට පරීක්ෂා කළ හැකිය

os.path.isdir("directory")

නිශ්චිත බහලුම පවතින බව එය බූලියන් සත්‍ය බවට පත් කරයි.

os.path.exists("directoryorfile")

නිශ්චිත නාමාවලියක් හෝ ගොනුවක් තිබේ නම් එය බූලාඩ් සත්‍ය වේ.

මාර්ගය නාමාවලියක් දැයි පරීක්ෂා කිරීමට;

os.path.isdir("directorypath")

මාර්ගය නාමාවලිය නම් බූලියන් සත්‍ය වේ


2
මෙය පැරණි, ඉහළ පිළිතුර සමඟ සම්පූර්ණයෙන්ම අතිරික්ත වේ.
ඩේවිස් හෙරින්ග්


10

මෙන්:

In [3]: os.path.exists('/d/temp')
Out[3]: True

නිසැකවම ටෝස් කරන්න os.path.isdir(...).


10

os.statඅනුවාදය සැපයීම සඳහා (පයිතන් 2):

import os, stat, errno
def CheckIsDir(directory):
  try:
    return stat.S_ISDIR(os.stat(directory).st_mode)
  except OSError, e:
    if e.errno == errno.ENOENT:
      return False
    raise

7

os ඔබට මෙම හැකියාවන් රාශියක් සපයයි:

import os
os.path.isdir(dir_in) #True/False: check if this is a directory
os.listdir(dir_in)    #gets you a list of all files and directories under dir_in

ආදාන මාර්ගය අවලංගු නම් ලැයිස්තුගත කරන්නා ව්‍යතිරේකයක් දමනු ඇත.


5
#You can also check it get help for you

if not os.path.isdir('mydir'):
    print('new directry has been created')
    os.system('mkdir mydir')

6
ඩිරෙක්ටරි සෑදීම සඳහා python හි බිල්ඩින් කාර්යයන් ඇත, එබැවින් වඩා හොඳ භාවිතා os.makedirs('mydir')කරන්නos.system(...)
gizzmole

9
ඔබ මුද්‍රණය කරන්නේ 'නව නාමාවලිය නිර්මාණය වී ඇති' නමුත් ඔබ එය නොදනී. නාමාවලියක් සෑදීමට ඔබට අවසර නොමැති නම් කුමක් කළ යුතුද? ඔබ 'නව නාමාවලිය නිර්මාණය කර ඇත' යනුවෙන් මුද්‍රණය කරන නමුත් එය සත්‍ය නොවේ. ඒක එහෙමද?
වොජ්චීක් ජකුබාස්

4

පහසු Unipathමොඩියුලයක් තිබේ.

>>> from unipath import Path 
>>>  
>>> Path('/var/log').exists()
True
>>> Path('/var/log').isdir()
True

ඔබට අවශ්‍ය විය හැකි වෙනත් දේවල්:

>>> Path('/var/log/system.log').parent
Path('/var/log')
>>> Path('/var/log/system.log').ancestor(2)
Path('/var')
>>> Path('/var/log/system.log').listdir()
[Path('/var/foo'), Path('/var/bar')]
>>> (Path('/var/log') + '/system.log').isfile()
True

පයිප්ප භාවිතයෙන් ඔබට එය ස්ථාපනය කළ හැකිය:

$ pip3 install unipath

එය ගොඩනංවන ලද ඒවාට සමාන ය pathlib. වෙනස නම්, එය සෑම මාර්ගයක්ම නූලක් ලෙස සලකයි ( Pathඑය උප කාණ්ඩයකි str), එබැවින් යම් ශ්‍රිතයක් නූලක් අපේක්ෂා කරන්නේ නම්, ඔබට එය පහසුවෙන් සම්මත කළ හැකිය aPath එය නූලක් බවට පරිවර්තනය කිරීමේ අවශ්‍යතාවයකින් තොරව වස්තුවක් .

උදාහරණයක් ලෙස, මෙය ජැන්ගෝ සහ settings.py:

# settings.py
BASE_DIR = Path(__file__).ancestor(2)
STATIC_ROOT = BASE_DIR + '/tmp/static'

4

නාමාවලිය එහි නොමැති නම් එය නිර්මාණය කිරීමටද ඔබට අවශ්‍ය විය හැකිය.

මූලාශ්රය , එය තවමත් SO හි තිබේ නම්.

============================================= ===================

පයිතන් ≥ 3.5 හි, භාවිතා කරන්න pathlib.Path.mkdir:

from pathlib import Path
Path("/my/directory").mkdir(parents=True, exist_ok=True)

පයිතන්ගේ පැරණි සංස්කරණ සඳහා, හොඳ ගුණාංග සහිත පිළිතුරු දෙකක් මම දකිමි, සෑම එකක්ම කුඩා අඩුපාඩුවක් ඇත, එබැවින් මම එය භාර ගනිමි:

උත්සාහ කරන්න os.path.exists, සහ os.makedirsනිර්මාණය සඳහා සලකා බලන්න .

import os
if not os.path.exists(directory):
    os.makedirs(directory)

අදහස් දැක්වීම්වල සහ වෙනත් තැන්වල සඳහන් කර ඇති පරිදි, තරඟ කොන්දේසියක් ඇත - os.path.existsසහ os.makedirsඇමතුම් අතර නාමාවලිය නිර්මාණය කර ඇත්නම් , ඒ os.makedirsසමඟ අසමත් වනු ඇත OSError. අවාසනාවට, බ්ලැන්කට් ඇල්ලීමOSError සහ ඉදිරියට යාම මෝඩකමක් නොවේ, මන්ද එය ප්‍රමාණවත් නොවන අවසර, සම්පූර්ණ තැටිය වැනි වෙනත් සාධක නිසා නාමාවලිය නිර්මාණය කිරීමට අපොහොසත් වනු ඇත.

එක් විකල්පයක් වනුයේ OSErrorකාවැද්දූ දෝෂ කේතය පරීක්ෂා කර බැලීමයි (බලන්න පයිතන්ගේ OSError වෙතින් තොරතුරු ලබා ගැනීමේ හරස් වේදිකා ක්‍රමයක් තිබේද ):

import os, errno

try:
    os.makedirs(directory)
except OSError as e:
    if e.errno != errno.EEXIST:
        raise

විකල්පයක් ලෙස, තත්පරයක් තිබිය හැකිය os.path.exists නමුත්, පළමු චෙක්පතෙන් පසුව තවත් අයෙකු නාමාවලිය නිර්මාණය කර, දෙවන පරීක්‍ෂණයට පෙර එය ඉවත් කළා යැයි සිතමු - අප තවමත් රැවටිය හැකිය.

යෙදුම මත පදනම්ව, සමගාමී මෙහෙයුම් වල අන්තරාය ගොනු අවසර වැනි වෙනත් සාධක මගින් ඇති වන අන්තරායට වඩා වැඩි හෝ අඩු විය හැකිය. ක්‍රියාත්මක කිරීමක් තෝරා ගැනීමට පෙර සංවර්ධකයාට විශේෂිත යෙදුම සහ එහි අපේක්ෂිත පරිසරය ගැන වැඩි විස්තර දැනගත යුතුය.

පයිතන්ගේ නවීන අනුවාදයන් නිරාවරණය කිරීමෙන් FileExistsError(3.3 + දී) මෙම කේතය තරමක් දියුණු කරයි ...

try:
    os.makedirs("path/to/directory")
except FileExistsError:
    # directory already exists
    pass

... සහ (3.2+ දී) මූල පද තර්කයක් os.makedirsකැඳවීමටexist_ok ඉඩ දීමෙන් .

os.makedirs("path/to/directory", exist_ok=True)  # succeeds even if directory exists.

0

කරුණු දෙකක්

  1. නාමාවලිය තිබේදැයි පරීක්ෂා කරන්න?
  2. එසේ නොවේ නම්, නාමාවලියක් සාදන්න (අත්‍යවශ්‍ය නොවේ).
import os
dirpath = "<dirpath>" # Replace the "<dirpath>" with actual directory path.

if os.path.exists(dirpath):
   print("Directory exist")
else: #this is optional if you want to create a directory if doesn't exist.
   os.mkdir(dirpath):
   print("Directory created")
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.