Cara membagi path dos menjadi komponen-komponennya dengan Python

153

Saya memiliki variabel string yang mewakili path dos, misalnya:

var = "d:\stuff\morestuff\furtherdown\THEFILE.txt"

Saya ingin membagi string ini menjadi:

[ "d", "stuff", "morestuff", "furtherdown", "THEFILE.txt" ]

Saya telah mencoba menggunakan split()dan replace()tetapi mereka hanya memproses backslash pertama atau mereka memasukkan angka hex ke dalam string.

Saya perlu mengubah variabel string ini menjadi string mentah entah bagaimana sehingga saya dapat menguraikannya.

Apa cara terbaik untuk melakukan ini?

Saya juga harus menambahkan bahwa isi varyaitu jalan yang saya coba uraikan, sebenarnya adalah nilai balik dari permintaan baris perintah. Bukan jalur data yang saya hasilkan sendiri. Ini disimpan dalam file, dan alat baris perintah tidak akan lepas dari garis miring terbalik.

BeeBand
sumber
6
Saat Anda meninjau jawaban ini, ingat bahwa os.path.splititu tidak berfungsi untuk Anda karena Anda tidak melarikan diri dari string itu dengan benar.
Jed Smith
Anda perlu keluar dari string atau menggunakan rawstring: r"d:\stuff\morestuff\furtherdown\THEFILE.txt"untuk mencegah hal-hal seperti \sdisalahtafsirkan.
smci

Jawaban:

164

Saya telah digigit banyak kali oleh orang-orang menulis fungsi mengutak-atik jalur mereka sendiri dan salah. Ruang, garis miring, garis miring terbalik, titik dua - kemungkinan kebingungan tidak terbatas, tetapi kesalahan tetap mudah dilakukan. Jadi saya ngotot untuk penggunaan os.path, dan merekomendasikannya atas dasar itu.

(Namun, jalan menuju kebajikan bukanlah yang paling mudah diambil, dan banyak orang ketika menemukan ini tergoda untuk mengambil jalan yang licin langsung ke kutukan. Mereka tidak akan menyadari sampai suatu hari semuanya hancur berkeping-keping, dan mereka - atau , lebih mungkin, orang lain - harus mencari tahu mengapa semuanya salah, dan ternyata seseorang membuat nama file yang mencampuradukkan garis miring dan garis miring terbalik - dan beberapa orang menyarankan bahwa jawabannya adalah "tidak melakukan itu". "Jangan menjadi salah satu dari orang-orang ini. Kecuali untuk orang yang mencampuradukkan garis miring dan garis miring terbalik - Anda bisa menjadi mereka jika Anda mau.)

Anda bisa mendapatkan drive dan path + file seperti ini:

drive, path_and_file = os.path.splitdrive(path)

Dapatkan path dan file:

path, file = os.path.split(path_and_file)

Mendapatkan nama-nama folder individual tidak terlalu nyaman, tetapi itu adalah jenis ketidaknyamanan lumayan menengah yang mempertinggi kesenangan kemudian menemukan sesuatu yang benar-benar berfungsi dengan baik:

folders = []
while 1:
    path, folder = os.path.split(path)

    if folder != "":
        folders.append(folder)
    else:
        if path != "":
            folders.append(path)

        break

folders.reverse()

(Ini muncul "\"di awal foldersjika path awalnya absolut. Anda bisa kehilangan sedikit kode jika Anda tidak menginginkannya.)

HunnyBear
sumber
@brone - Saya lebih suka menggunakan solusi ini, daripada harus khawatir akan lolos dari backslash. Terima kasih!
BeeBand
1
Saya akan senang terbukti salah tetapi bagi saya solusi yang disarankan tidak bekerja jika jalur seperti ini "C: \ usr \ rs0 \ my0 \ in111102.log" digunakan (kecuali input awal adalah string mentah )?
shearichard
1
Sepertinya ini tidak akan membagi jalan dengan benar jika hanya berisi direktori di OSX seperti "/ path / ke / my / folder /", untuk mencapai itu Anda ingin menambahkan dua baris ini ke awal: if path.endswith("/"):dan path = path[:-1].
Kevin London
1
Saya lebih suka solusi oleh @Tompa
jaycode
1
Saya setuju dengan jaycode : Tompa 's solusi adalah dengan pendekatan kanonik dan seharusnya jawaban yang diterima. Alternatif yang terlalu rumit, tidak efisien, dan rawan kesalahan ini gagal untuk meneruskan kode produksi. Tidak ada alasan yang masuk akal untuk mencoba (... dan gagal, tentu saja) untuk mengurai secara terpisah nama path ketika pemisahan string sederhana berhasil hanya dengan satu baris kode.
Cecil Curry
287

Saya akan lakukan

import os
path = os.path.normpath(path)
path.split(os.sep)

Pertama menormalkan string path menjadi string yang tepat untuk OS. Maka os.sepharus aman untuk digunakan sebagai pembatas dalam fungsi string split.

Tompa
sumber
25
Satu jawaban yang benar: sudah muncul . Solusi kanonik adalah yang paling sederhana, tentu saja. Melihat! Untuk itu elegan dan contumely dan tidak memiliki tepi kasus yang tak tertahankan.
Cecil Curry
20
Sebagai satu-liner,os.path.normpath(a_path).split(os.path.sep)
Daniel Farrell
2
Ini sepertinya tidak berfungsi untuk path = root. Dalam hal ini, hasil dari path.split adalah ['', '']. Bahkan secara umum, solusi split () ini memberikan direktori paling kiri dengan nama string-kosong (yang dapat diganti dengan garis miring yang sesuai). Masalah intinya adalah bahwa slash tunggal (maju atau mundur tergantung pada OS) adalah nama direktori root, sedangkan di tempat lain di jalur itu adalah pemisah .
gwideman
2
Akankah itu bekerja lebih baik dengan lstrip? os.path.normpath(path).lstrip(os.path.sep).split(os.path.sep)
Vidar
1
@ user60561 Itu karena di Linux, backslash adalah karakter yang diperbolehkan dalam nama file, sedangkan pada Windows tidak ada forward slash. Itu sebabnya pada Windows, normpathakan mengenali garis miring sebagai pemisah. Di Linux, Anda normpathcukup berasumsi bahwa Anda memiliki direktori yang dipanggil \1\2dan file atau direktori di dalamnya disebut 3.
Vojislav Stojkovic
81

Anda cukup menggunakan pendekatan Pythonic (IMHO) yang paling:

import os

your_path = r"d:\stuff\morestuff\furtherdown\THEFILE.txt"
path_list = your_path.split(os.sep)
print path_list

Yang akan memberi Anda:

['d:', 'stuff', 'morestuff', 'furtherdown', 'THEFILE.txt']

Petunjuk di sini adalah untuk menggunakan os.sepalih-alih '\\'atau '/', karena ini membuatnya sistem independen.

Untuk menghapus titik dua dari huruf drive (walaupun saya tidak melihat alasan mengapa Anda ingin melakukan itu), Anda dapat menulis:

path_list[0] = path_list[0][0]
Maciek D.
sumber
22
Ini bekerja some times. Kali lain (setidaknya di windows) Anda akan menemukan jalan yang terlihat seperti folder\folder2\folder3/file.txt. Lebih baik untuk menormalkan dulu (os.path.normpath) jalan dan kemudian membaginya.
vikki
7
Jawaban ini hampir sampai. Seperti yang disarankan vikki , kegagalan untuk menormalkan nama path sebelum mantra pemisah string berakhir pada kasus tepi biasa (misalnya, /foo//bar). Lihat Tompa 's jawaban untuk solusi yang lebih kuat.
Cecil Curry
62

Dalam Python> = 3,4 ini menjadi jauh lebih sederhana. Anda sekarang dapat menggunakan pathlib.Path.partsuntuk mendapatkan semua bagian dari jalan.

Contoh:

>>> from pathlib import Path
>>> Path('C:/path/to/file.txt').parts
('C:\\', 'path', 'to', 'file.txt')
>>> Path(r'C:\path\to\file.txt').parts
('C:\\', 'path', 'to', 'file.txt')

Pada instalasi Windows dari Python 3 ini akan menganggap bahwa Anda bekerja dengan jalur Windows, dan pada * nix itu akan menganggap bahwa Anda bekerja dengan jalur posix. Ini biasanya yang Anda inginkan, tetapi jika tidak, Anda bisa menggunakan kelas pathlib.PurePosixPathatau pathlib.PureWindowsPathsesuai kebutuhan:

>>> from pathlib import PurePosixPath, PureWindowsPath
>>> PurePosixPath('/path/to/file.txt').parts
('/', 'path', 'to', 'file.txt')
>>> PureWindowsPath(r'C:\path\to\file.txt').parts
('C:\\', 'path', 'to', 'file.txt')
>>> PureWindowsPath(r'\\host\share\path\to\file.txt').parts
('\\\\host\\share\\', 'path', 'to', 'file.txt')

Sunting: Ada juga backport ke python 2 yang tersedia: pathlib2

freidrichen
sumber
3
Path.parts adalah apa yang selalu saya inginkan, tetapi saya tidak pernah tahu itu ada sampai hari ini.
JamEnergy
mengapa ini belum melilit fungsi python asli yang bagus?
Eduardo Pignatelli
2
ITULAH jawabannya!
nayriz
11

Masalahnya di sini dimulai dengan bagaimana Anda membuat string di tempat pertama.

a = "d:\stuff\morestuff\furtherdown\THEFILE.txt"

Dilakukan dengan cara ini, Python sedang mencoba untuk kasus khusus ini: \s, \m, \f, dan \T. Dalam kasus Anda, \fsedang diperlakukan sebagai formfeed (0x0C) sementara backslash lainnya ditangani dengan benar. Yang perlu Anda lakukan adalah salah satunya:

b = "d:\\stuff\\morestuff\\furtherdown\\THEFILE.txt"      # doubled backslashes
c = r"d:\stuff\morestuff\furtherdown\THEFILE.txt"         # raw string, no doubling necessary

Kemudian setelah Anda membagi salah satu dari ini, Anda akan mendapatkan hasil yang Anda inginkan.

Craig Trader
sumber
@W. Craig Trader - terima kasih, tetapi jalur ini bukan yang saya hasilkan sendiri - ini kembali kepada saya dari program lain dan saya harus menyimpan data ini dalam sebuah variabel. Saya tidak yakin bagaimana mengkonversi data yang disimpan dalam variabel menjadi "teks mentah".
BeeBand
Tidak ada yang namanya "teks mentah" ... hanya bagaimana Anda menggambarkannya di sumber. Baik tambahkan r "" ke string, atau lewati .replace ('\\', '/')
Marco Mariani
@ BeeBand, bagaimana Anda mendapatkan kembali data dari program lain? Apakah Anda membacanya dari file, pipa, soket? Jika demikian, maka Anda tidak perlu melakukan sesuatu yang mewah; satu-satunya alasan untuk menggandakan backslash atau menggunakan string mentah adalah untuk menempatkan konstanta string ke dalam kode Python. Di sisi lain, jika program lain menghasilkan double-backslash, maka Anda ingin membersihkannya sebelum memisahkan jalan Anda.
Craig Trader
@W. Craig Trader - saya membacanya dari file, yang ditulis oleh program lain. Saya tidak bisa mendapatkan split()atau replace()bekerja karena suatu alasan - saya terus mendapatkan nilai hex. Anda benar, saya pikir saya menggonggong pohon yang salah dengan ide string mentah - saya pikir saya hanya menggunakan split()salah. Karena saya mencoba beberapa solusi ini menggunakan split()dan mereka bekerja untuk saya sekarang.
BeeBand
10

Untuk solusi yang lebih ringkas, pertimbangkan hal berikut:

def split_path(p):
    a,b = os.path.split(p)
    return (split_path(a) if len(a) and len(b) else []) + [b]
pengguna1556435
sumber
Ini adalah solusi favorit saya untuk masalah ini. Sangat bagus.
Will Moore
1
Ini tidak berfungsi jika jalan berakhir dengan /. Juga, memberi Anda string kosong di awal daftar jika jalur Anda mulai dengan/
Sorig
4

Saya tidak bisa benar-benar menyumbangkan jawaban nyata untuk yang ini (karena saya datang ke sini berharap untuk menemukan sendiri), tetapi bagi saya jumlah pendekatan yang berbeda dan semua peringatan yang disebutkan adalah indikator paling pasti bahwa modul os.path Python sangat membutuhkan ini sebagai fungsi bawaan.

antred
sumber
4

Cara fungsional, dengan generator .

def split(path):
    (drive, head) = os.path.splitdrive(path)
    while (head != os.sep):
        (head, tail) = os.path.split(head)
        yield tail

Beraksi:

>>> print([x for x in split(os.path.normpath('/path/to/filename'))])
['filename', 'to', 'path']
Benoit
sumber
3

Ini bekerja untuk saya:

>>> a=r"d:\stuff\morestuff\furtherdown\THEFILE.txt"
>>> a.split("\\")
['d:', 'stuff', 'morestuff', 'furtherdown', 'THEFILE.txt']

Tentu Anda mungkin perlu juga menghapus usus besar dari komponen pertama, tetapi menjaganya agar tetap memungkinkan untuk merakit kembali jalan.

The rtanda pengubah string literal sebagai "mentah"; perhatikan bagaimana backslash tertanam tidak digandakan.

beristirahat
sumber
@wwind - bagian rdepan string Anda, apa maksudnya?
BeeBand
2
r berarti string mentah - secara otomatis lolos dari \ karakter. Ini berguna untuk digunakan setiap kali Anda melakukan jalur.
Wayne Werner
1
@BeeBand: Anda tidak perlu peduli; r "" hanyalah sesuatu yang penting selama kompilasi / parsing kode, itu bukan sesuatu yang menjadi properti dari string yang pernah diuraikan. Ini hanya berarti "inilah string literal, tetapi jangan menafsirkan garis miring terbalik memiliki makna lain selain garis miring terbalik".
bersantai
3
Saya pikir mungkin akan membantu untuk menyebutkan Anda minus juga melakukannya lebih ambigu menggunakan a.split (os.sep) daripada mengkodekannya dengan keras?
Tim McJilton
4
Saya harus menurunkan suara Anda karena kehilangan kesempatan untuk menjelaskan os.path.splitdan os.pathsep, mengingat keduanya jauh lebih portabel daripada yang Anda tulis. Mungkin tidak masalah untuk OP sekarang, tetapi ketika dia menulis sesuatu yang perlu memindahkan platform.
Jed Smith
3

Hal-hal tentang mypath.split("\\")akan lebih baik dinyatakan sebagai mypath.split(os.sep). sepadalah pemisah jalur untuk platform khusus Anda (misalnya, \untuk Windows, /untuk Unix, dll.), dan bangunan Python tahu mana yang akan digunakan. Jika Anda menggunakan sep, maka kode Anda akan menjadi platform agnostik.

Chris
sumber
1
Atau os.path.split. Anda ingin berhati-hati dengan os.pathsep, karena itu :pada versi saya Python di OS X (dan os.path.splitmenangani dengan benar /).
Jed Smith
4
Maksudmu os.sepbukan os.pathsep. Ikuti kebijaksanaan dalam os.sepdokumen: Perhatikan bahwa mengetahui ini tidak cukup untuk dapat menguraikan atau menggabungkan nama path - gunakan os.path.split () dan os.path.join ().
Jon-Eric
1

re.split () dapat membantu sedikit lebih banyak daripada string.split ()

import re    
var = "d:\stuff\morestuff\furtherdown\THEFILE.txt"
re.split( r'[\\/]', var )
['d:', 'stuff', 'morestuff', 'furtherdown', 'THEFILE.txt']

Jika Anda juga ingin mendukung jalur Linux dan Mac, cukup tambahkan filter (Tidak ada, hasil), sehingga akan menghapus '' yang tidak diinginkan dari split () karena jalurnya dimulai dengan '/' atau '//'. misalnya '// mount / ...' atau '/ var / tmp /'

import re    
var = "/var/stuff/morestuff/furtherdown/THEFILE.txt"
result = re.split( r'[\\/]', var )
filter( None, result )
['var', 'stuff', 'morestuff', 'furtherdown', 'THEFILE.txt']
Asi
sumber
1

Anda dapat secara rekursif os.path.splitstring

import os
def parts(path):
    p,f = os.path.split(path)
    return parts(p) + [f] if f else [p]

Menguji ini terhadap beberapa string path, dan memasang kembali path dengan os.path.join

>>> for path in [
...         r'd:\stuff\morestuff\furtherdown\THEFILE.txt',
...         '/path/to/file.txt',
...         'relative/path/to/file.txt',
...         r'C:\path\to\file.txt',
...         r'\\host\share\path\to\file.txt',
...     ]:
...     print parts(path), os.path.join(*parts(path))
... 
['d:\\', 'stuff', 'morestuff', 'furtherdown', 'THEFILE.txt'] d:\stuff\morestuff\furtherdown\THEFILE.txt
['/', 'path', 'to', 'file.txt'] /path\to\file.txt
['', 'relative', 'path', 'to', 'file.txt'] relative\path\to\file.txt
['C:\\', 'path', 'to', 'file.txt'] C:\path\to\file.txt
['\\\\', 'host', 'share', 'path', 'to', 'file.txt'] \\host\share\path\to\file.txt

Elemen pertama dari daftar mungkin perlu diperlakukan berbeda tergantung pada bagaimana Anda ingin berurusan dengan huruf drive, jalur UNC dan jalur absolut dan relatif. Mengubah yang terakhir [p]untuk [os.path.splitdrive(p)]memaksa masalah dengan memecah huruf drive dan direktori root menjadi tuple.

import os
def parts(path):
    p,f = os.path.split(path)
    return parts(p) + [f] if f else [os.path.splitdrive(p)]

[('d:', '\\'), 'stuff', 'morestuff', 'furtherdown', 'THEFILE.txt']
[('', '/'), 'path', 'to', 'file.txt']
[('', ''), 'relative', 'path', 'to', 'file.txt']
[('C:', '\\'), 'path', 'to', 'file.txt']
[('', '\\\\'), 'host', 'share', 'path', 'to', 'file.txt']

Sunting: Saya menyadari bahwa jawaban ini sangat mirip dengan yang diberikan di atas oleh user1556435 . Saya meninggalkan jawaban saya karena penanganan komponen drive jalur berbeda.

Mike Robins
sumber
0

Seperti yang dijelaskan orang lain - masalah Anda berasal dari penggunaan \, yaitu karakter pelarian dalam string literal / konstan. OTOH, jika Anda memiliki string path file dari sumber lain (baca dari file, konsol atau dikembalikan dengan fungsi os) - tidak akan ada masalah pemisahan pada '\\' atau r '\'.

Dan seperti yang disarankan orang lain, jika Anda ingin menggunakannya \dalam program literal, Anda harus menduplikasinya \\atau seluruh literal harus diawali dengan r, seperti demikian r'lite\ral'atau r"lite\ral"untuk menghindari parser mengonversi itu \danr ke karakter CR (carriage return).

Ada satu cara lagi - jangan gunakan backslash \pathnames dalam kode Anda! Sejak abad terakhir Windows mengenali dan bekerja dengan baik dengan nama path yang menggunakan forward slash sebagai pemisah direktori /! Entah bagaimana tidak banyak orang tahu itu .. tetapi ia bekerja:

>>> var = "d:/stuff/morestuff/furtherdown/THEFILE.txt"
>>> var.split('/')
['d:', 'stuff', 'morestuff', 'furtherdown', 'THEFILE.txt']

Ngomong-ngomong, kode Anda berfungsi di Unix, Windows, dan Mac ... karena semuanya digunakan /sebagai pemisah direktori ... bahkan jika Anda tidak ingin menggunakan konstanta yang sudah ditentukan sebelumnya dari modul os.

Nas Banov
sumber
Sayangnya data sedang dikembalikan kepada saya dari program lain yang saya jalankan dari skrip python saya. Saya tidak memiliki kendali atas apakah akan menggunakan '\' atau '/' - ini adalah program pihak ketiga yang menentukan ini (mungkin berdasarkan platform).
BeeBand
@BeeBand: Ah, maka Anda tidak akan memiliki masalah yang Anda alami selama pengujian, ketika Anda memberikan string sebagai literal dalam program Anda. Atau Anda dapat melakukan peretasan jahat berikut setelah menerima jalan: var = var.replace('\\','/')- ganti \ dengan / dan lanjutkan bekerja dengan hanya memangkas :)
Nas Banov
itu memang peretasan jahat: o)
BeeBand
@BeeBand: itu sebabnya saya memperingatkan. Ketika saya mengatakan sesuatu itu jahat, saya tidak harus mengatakan bahwa itu tidak boleh digunakan - tetapi orang harus sangat sadar mengapa mereka menggunakannya dan waspada terhadap konsekuensi yang tidak diinginkan. Dalam hal ini, konsekuensi yang sangat tidak mungkin adalah bahwa jika ini digunakan pada sistem file Unix dengan `` digunakan dalam nama file atau direktori (itu benar-benar sulit tetapi mungkin) - kode ini akan 'rusak'
Nas Banov
0

Anggap Anda memiliki file filedata.txtdengan konten:

d:\stuff\morestuff\furtherdown\THEFILE.txt
d:\otherstuff\something\otherfile.txt

Anda dapat membaca dan membagi jalur file:

>>> for i in open("filedata.txt").readlines():
...     print i.strip().split("\\")
... 
['d:', 'stuff', 'morestuff', 'furtherdown', 'THEFILE.txt']
['d:', 'otherstuff', 'something', 'otherfile.txt']
zoli2k
sumber
ini memang berhasil, terima kasih! Tapi saya memilih solusi brone karena saya lebih suka tidak khawatir akan lolos dari backslash.
BeeBand
9
Bukan pythonic karena ini bergantung pada sistem file.
jb.
0

Saya menggunakan berikut ini karena menggunakan fungsi os.path.basename itu tidak menambahkan garis miring ke daftar yang dikembalikan. Ini juga berfungsi dengan garis miring platform apa pun: yaitu jendela \ atau \ /. Dan lebih jauh lagi, ini tidak menambahkan Windows yang digunakan untuk jalur server :)

def SplitPath( split_path ):
    pathSplit_lst   = []
    while os.path.basename(split_path):
        pathSplit_lst.append( os.path.basename(split_path) )
        split_path = os.path.dirname(split_path)
    pathSplit_lst.reverse()
    return pathSplit_lst

Jadi untuk '\\ server \\ folder1 \\ folder2 \\ folder3 \\ folder4'

Anda mendapatkan

['server', 'folder1', 'folder2', 'folder3', 'folder4']

Jay
sumber
1
Itu tidak mengikuti invarian yang meneruskan hasil Anda untuk os.path.join()harus mengembalikan string asli. Saya akan mengatakan output yang benar untuk input contoh Anda adalah [r'\\','server','folder1','folder2','folder3','folder4']. Yaitu apa os.path.split().
Jon-Eric
0

Saya tidak benar-benar yakin apakah ini sepenuhnya menjawab pertanyaan, tetapi saya bersenang-senang menulis fungsi kecil ini yang menyimpan setumpuk, menempel pada manipulasi berbasis os.path, dan mengembalikan daftar / tumpukan item.

  9 def components(path):
 10     ret = []
 11     while len(path) > 0:
 12         path, crust = split(path)
 13         ret.insert(0, crust)
 14
 15     return ret
 16
mallyvai
sumber
0

Baris kode di bawah ini dapat menangani:

  1. C: / path / path
  2. C: // path // path
  3. C: \ path \ path
  4. C: \ path \ path

path = re.split (r '[/// \]', path)

Gour Bera
sumber
0

Satu rekursif untuk bersenang-senang.

Bukan jawaban yang paling elegan, tetapi harus bekerja di mana saja:

import os

def split_path(path):
    head = os.path.dirname(path)
    tail = os.path.basename(path)
    if head == os.path.dirname(head):
        return [tail]
    return split_path(head) + [tail]
DuGNu
sumber
memang, maaf. Seharusnya dengan hati-hati membaca pertanyaan ... jalan 'dos'.
DuGNu
-1

menggunakan ntpath.split()

deft_code
sumber
ketika saya menggunakan os.path.split () Saya dapat, ( d:\\stuff, morestuff\x0curtherdown\thefile.mux)
BeeBand
Seperti yang ditunjukkan oleh BeeBand, os.path.split () benar-benar tidak melakukan hal yang diinginkan.
bersantai
maaf saya baru sadar os.path hanya berfungsi tergantung os anda. ntpath akan mengurai path dos.
deft_code
bahkan dengan ntpath saya masih mendapatkand:\\stuff, morestuff\x0curtherdown\thefile.mux
BeeBand
2
@BeeBand: Anda mengalami masalah saat melarikan diri dari string Anda. '\x0c'adalah karakter umpan formulir. Cara membuat karakter umpan formulir adalah '\ f'. Jika Anda benar-benar menginginkan string literal '\ f', Anda memiliki dua opsi: '\\f'atau r'\f'.
deft_code