Lagi

Mengonversi nilai di bidang datetime menjadi string di bidang teks menggunakan pengurai Python dari ArcGIS untuk Desktop?

Mengonversi nilai di bidang datetime menjadi string di bidang teks menggunakan pengurai Python dari ArcGIS untuk Desktop?


Dalam tabel atribut kelas fitur geodatabase file saya, saya memiliki bidang terisi yang disebut DateField dari jenis tanggal, dan bidang teks yang disebut TextField.

Saya belum menemukan cara untuk mengonversi tanggal di DateField ke stringhh/mm/ttttformat di TextField.

Saya pikir jawaban ini untuk Mengonversi nilai tanggal ArcGIS menjadi pembacaan string dalam format mm/hh/tttt menggunakan ArcPy? seharusnya memberi saya petunjuk yang cukup, tetapi ketika saya mencoba yang berikut ini di Kalkulator Bidang, itu menghasilkan kesalahan yang mengikuti.

Pengurai: Python

Kode Skrip Pra-Logika:

dari datetime import datetime def date_only(datetimeVal): formattedTime = datetime.strftime(datetimeVal, "%d/%m/%Y") mengembalikan formattedTime

Bidang Teks =

date_only( !DateField! )

Kesalahannya adalah:

Pelaksana Pesan: HitungField NegaraFC TextField date_only( !DateField! ) PYTHON_9.3 "from datetime import datetime

def date_only(datetimeVal):
 formattedTime = datetime.strftime(datetimeVal, "%m/%d/%Y") 
 return formattedTime" Waktu Mulai: Sen 02 Feb 08:45:07 2015 ERROR 000539: Kesalahan saat menjalankan ekspresi: date_only( u"13/02/2015 2:47:58 PM" ) Traceback (panggilan terakhir terakhir): File "", baris 1, di  berkas "", baris 4, di date_only TypeError: deskriptor 'strftime' memerlukan objek 'datetime.date' tetapi menerima 'unicode' Gagal mengeksekusi (CalculateField). Gagal pada Senin, 02 Februari 08:45:07 2015 (Waktu Berlalu: 0,03 detik)

Dari kesalahan saya pikir apa yang mungkin saya lewatkan adalah pengetahuan tentang cara mengubah objek Unicode yang diterima oleh fungsi date_only saya menjadi objek datetime.date.

Secara kebetulan, saya perhatikan bahwa saat ini ada pertanyaan serupa yang belum terjawab di Stack Overflow.


Dengan bantuan @MichaelMiles-Stimson, Kode Skrip Pra-Logika yang akhirnya saya gunakan adalah:

def date_only(datetimeVal): datePart = datetimeVal.split(" ")[0] mengembalikan datePart

Alasan saya perlu melakukannya dengan cara ini daripada metode yang tepat yang digunakan oleh @ blah238 dalam jawaban atas pertanyaan lain adalah bahwa Kalkulator Bidang melakukan datetime ke string konversi objek. Sebaliknya menggunakan kursor dapat mengakses objek datetime dalam keadaan mentah mereka.


Ubah tipe data kolom &ldquonvarchar&rdquo menjadi "DateTime'

Adakah yang tahu cara mengonversi tipe data kolom dari " nvarchar " format menjadi " tanggal Waktu " di SQL Server?

Saya sudah mencoba kueri di bawah ini:

ALTER TABLE MyTable ALTER COLUMN UpdatedTanggal datetime date

Konversi tipe data nvarchar ke tipe data datetime menghasilkan nilai di luar rentang.


Gambar Format Tanggal dan Waktu

Gambar format tanggal dan/atau waktu adalah string teks yang digunakan untuk menafsirkan nilai data yang berisi informasi tanggal dan/atau waktu. Setiap gambar format terdiri dari kombinasi format dari jenis format yang tersedia. Beberapa contoh tipe format adalah Day of Week, Month, Hour, dan Second. Dalam satu gambar format tanggal dan/atau waktu, hanya satu format dari setiap jenis format yang harus digunakan. Namun, setiap jenis format tidak perlu disertakan dalam format gambar. Misalnya, sangat umum untuk menentukan gambar format tanggal yang hanya berisi informasi Tahun, Bulan, dan Hari dalam Bulan, tanpa menyertakan informasi apa pun tentang waktu dalam sehari.

Gambar format hanya dapat berisi informasi waktu, hanya informasi tanggal, atau kombinasi informasi tanggal dan waktu. Format gambar juga dapat menyertakan pemisah, seperti koma, yang dapat digunakan untuk memisahkan format yang digunakan dalam format gambar.

Umumnya, Anda perlu menganalisis data khusus Anda dan menentukan tanggal dan/atau format gambar waktu yang sesuai yang diperlukan untuk menafsirkan data Anda. Contoh berikut dimaksudkan untuk memberi Anda pemahaman tentang berbagai format gambar yang ada untuk menafsirkan tanggal dan waktu dalam format yang berbeda.


Objek Popen

Contoh kelas Popen memiliki metode berikut:

Periksa apakah proses anak telah dihentikan. Setel dan kembalikan atribut kode pengembalian. Jika tidak, kembalikan None .

Tunggu proses anak berakhir. Setel dan kembalikan atribut kode pengembalian.

Jika proses tidak berhenti setelah waktu habis detik, naikkan pengecualian TimeoutExpired. Aman untuk menangkap pengecualian ini dan mencoba menunggu lagi.

Ini akan menemui jalan buntu saat menggunakan stdout=PIPE atau stderr=PIPE dan proses anak menghasilkan output yang cukup ke pipa sehingga memblokir menunggu buffer pipa OS untuk menerima lebih banyak data. Gunakan Popen.communicate() saat menggunakan pipa untuk menghindarinya.

Fungsi ini diimplementasikan menggunakan loop sibuk (panggilan non-blocking dan tidur singkat). Gunakan modul asyncio untuk menunggu asinkron: lihat asyncio.create_subprocess_exec .

Berubah di versi 3.3: waktu habis telah ditambahkan.

Berinteraksi dengan proses: Kirim data ke stdin. Baca data dari stdout dan stderr, hingga akhir file tercapai. Tunggu hingga proses berhenti dan atur atribut kode kembali. Opsional memasukkan argumen harus berupa data yang akan dikirim ke proses anak, atau None , jika tidak ada data yang harus dikirim ke anak. Jika aliran dibuka dalam mode teks, memasukkan harus berupa string. Jika tidak, itu harus byte.

berkomunikasi() mengembalikan Tuple (stdout_data, stderr_data) . Data akan berupa string jika aliran dibuka dalam mode teks jika tidak, byte.

Perhatikan bahwa jika Anda ingin mengirim data ke stdin proses, Anda perlu membuat objek Popen dengan stdin=PIPE . Demikian pula, untuk mendapatkan apa pun selain None di Tuple hasil, Anda perlu memberikan stdout=PIPE dan/atau stderr=PIPE juga.

Jika proses tidak berhenti setelah waktu habis detik, pengecualian TimeoutExpired akan dimunculkan. Menangkap pengecualian ini dan mencoba kembali komunikasi tidak akan kehilangan output apa pun.

Proses anak tidak dimatikan jika batas waktu berakhir, jadi untuk membersihkan dengan benar, aplikasi yang berperilaku baik harus mematikan proses anak dan menyelesaikan komunikasi:

Data yang dibaca dibuffer di memori, jadi jangan gunakan metode ini jika ukuran datanya besar atau tidak terbatas.

Berubah di versi 3.3: waktu habis telah ditambahkan.

Mengirim sinyal sinyal kepada anak.

Tidak melakukan apa-apa jika prosesnya selesai.

Di Windows, SIGTERM adalah alias untuk terminasi() . CTRL_C_EVENT dan CTRL_BREAK_EVENT dapat dikirim ke proses yang dimulai dengan bendera penciptaan parameter yang menyertakan CREATE_NEW_PROCESS_GROUP .

Hentikan anak itu. Pada POSIX OS, metode mengirimkan SIGTERM ke anak. Pada Windows, fungsi API Win32 TerminateProcess() dipanggil untuk menghentikan anak.

Membunuh anak. Pada POSIX OS, fungsi mengirimkan SIGKILL ke anak. Di Windows, kill() adalah alias untuk mengakhiri() .

Atribut berikut juga tersedia:

NS argumen argumen saat diteruskan ke Popen – urutan argumen program atau string tunggal.

jika stdin argumennya adalah PIPE , atribut ini adalah objek aliran yang dapat ditulisi seperti yang dikembalikan oleh open() . jika pengkodean atau kesalahan argumen ditentukan atau universal_newlines argumen adalah True , alirannya adalah aliran teks, jika tidak, itu adalah aliran byte. jika stdin argumen bukan PIPA , atribut ini Tidak Ada .

jika stdout argumennya adalah PIPE , atribut ini adalah objek aliran yang dapat dibaca seperti yang dikembalikan oleh open() . Membaca dari aliran memberikan output dari proses anak. jika pengkodean atau kesalahan argumen ditentukan atau universal_newlines argumen adalah True , alirannya adalah aliran teks, jika tidak, itu adalah aliran byte. jika stdout argumen bukan PIPA , atribut ini Tidak Ada .

jika stderr argumennya adalah PIPE , atribut ini adalah objek aliran yang dapat dibaca seperti yang dikembalikan oleh open() . Membaca dari aliran memberikan keluaran kesalahan dari proses anak. jika pengkodean atau kesalahan argumen ditentukan atau universal_newlines argumen adalah True , alirannya adalah aliran teks, jika tidak, itu adalah aliran byte. jika stderr argumen bukan PIPA , atribut ini Tidak Ada .

Gunakan communication() daripada .stdin.write , .stdout.read atau .stderr.read untuk menghindari kebuntuan karena buffer pipa OS lainnya mengisi dan memblokir proses anak.

ID proses dari proses anak.

Perhatikan bahwa jika Anda mengatur kerang argumen ke True , ini adalah ID proses dari shell yang muncul.

Kode pengembalian anak, ditetapkan oleh poll() dan wait() (dan secara tidak langsung oleh communication() ). Nilai None menunjukkan bahwa proses belum dihentikan.

Nilai negatif -N menunjukkan bahwa anak dihentikan oleh sinyal N (hanya POSIX).


Objek tanggal¶

Objek tanggal mewakili tanggal (tahun, bulan dan hari) dalam kalender ideal, kalender Gregorian saat ini diperpanjang tanpa batas di kedua arah.

1 Januari tahun 1 disebut hari nomor 1, 2 Januari tahun 1 disebut hari nomor 2, dan seterusnya. 2

Semua argumen diperlukan. Argumen harus bilangan bulat, dalam rentang berikut:

1 <= hari <= jumlah hari dalam bulan dan tahun tertentu

Jika argumen di luar rentang tersebut diberikan, ValueError dimunculkan.

Konstruktor lain, semua metode kelas:

Kembalikan tanggal lokal saat ini.

Ini setara dengan date.fromtimestamp(time.time()) .

metode kelas tanggal. dari stempel waktu ( stempel waktu ) ¶

Kembalikan tanggal lokal yang sesuai dengan stempel waktu POSIX, seperti yang dikembalikan oleh time.time() .

Ini dapat meningkatkan OverflowError , jika stempel waktu di luar rentang nilai yang didukung oleh fungsi platform C localtime(), dan kegagalan OSError pada localtime(). Biasanya ini dibatasi untuk tahun dari 1970 hingga 2038. Perhatikan bahwa pada sistem non-POSIX yang menyertakan detik kabisat dalam gagasan mereka tentang stempel waktu, detik kabisat diabaikan oleh fromtimestamp() .

Diubah di versi 3.3: Naikkan OverflowError alih-alih ValueError jika stempel waktu di luar rentang nilai yang didukung oleh fungsi platform C localtime(). Naikkan OSError alih-alih ValueError pada kegagalan localtime().

Kembalikan tanggal yang sesuai dengan ordinal Gregorian proleptik, di mana 1 Januari tahun 1 memiliki ordinal 1.

ValueError dinaikkan kecuali 1 <= ordinal <= date.max.toordinal() . Untuk tanggal apa pun d, tanggal.fromordinal(d.toordinal()) == d .

metode kelas tanggal. dari format iso ( tanggal_string ) ¶

Kembalikan tanggal yang sesuai dengan a tanggal_string diberikan dalam format YYYY-MM-DD :

Ini adalah kebalikan dari date.isoformat() . Ini hanya mendukung format YYYY-MM-DD .

Kembalikan tanggal yang sesuai dengan tanggal kalender ISO yang ditentukan berdasarkan tahun, minggu, dan hari. Ini adalah kebalikan dari fungsi date.isocalendar() .

Tanggal terwakili paling awal, date(MINYEAR, 1, 1) .

Tanggal perwakilan terbaru, tanggal(MAXYEAR, 12, 31) .

Perbedaan terkecil yang mungkin antara objek tanggal yang tidak sama, timedelta(days=1) .

Atribut instans (hanya baca):

Antara 1 dan 12 inklusif.

Antara 1 dan jumlah hari pada bulan tertentu pada tahun tertentu.

tanggal2 adalah timedelta.days hari dihapus dari tanggal1. (1)

menghitung tanggal2 sedemikian rupa sehingga date2 + timedelta == date1 . (2)

tanggal1 dianggap kurang dari tanggal2 kapan tanggal1 mendahului tanggal2 pada waktunya. (4)

tanggal2 bergerak maju dalam waktu jika timedelta.days > 0 , atau mundur jika timedelta.days < 0 . Setelah itu date2 - date1 == timedelta.days . timedelta.seconds dan timedelta.microseconds diabaikan. OverflowError dimunculkan jika date2.year akan lebih kecil dari MINYEAR atau lebih besar dari MAXYEAR .

timedelta.seconds dan timedelta.microseconds diabaikan.

Ini tepat, dan tidak bisa meluap. timedelta.seconds dan timedelta.microseconds adalah 0, dan date2 + timedelta == date1 setelahnya.

Dengan kata lain, date1 < date2 jika dan hanya jika date1.toordinal() < date2.toordinal() . Perbandingan tanggal memunculkan TypeError jika pembanding lain juga bukan objek tanggal. Namun, NotImplemented dikembalikan sebagai gantinya jika pembanding lainnya memiliki atribut timetuple() . Kait ini memberi jenis objek tanggal lain kesempatan untuk menerapkan perbandingan tipe campuran. Jika tidak, ketika objek tanggal dibandingkan dengan objek dari tipe yang berbeda, TypeError dimunculkan kecuali perbandingannya adalah == atau != . Kasus terakhir mengembalikan False atau True , masing-masing.

Dalam konteks Boolean, semua objek tanggal dianggap benar.

tanggal. mengganti ( tahun=diri.tahun, bulan=diri.bulan, hari=diri.hari ) ¶

Kembalikan tanggal dengan nilai yang sama, kecuali untuk parameter yang diberi nilai baru dengan argumen kata kunci mana pun yang ditentukan.

Jam, menit dan detik adalah 0, dan bendera DST adalah -1.

d.timetuple() setara dengan:

di mana yday = d.toordinal() - date(d.year, 1, 1).toordinal() + 1 adalah nomor hari dalam tahun berjalan yang dimulai dengan 1 untuk 1 Januari.

Kembalikan ordinal Gregorian proleptik dari tanggal, di mana 1 Januari tahun 1 memiliki ordinal 1. Untuk objek tanggal apa pun d, tanggal.fromordinal(d.toordinal()) == d .

Kembalikan hari dalam seminggu sebagai bilangan bulat, di mana Senin adalah 0 dan Minggu adalah 6. Misalnya, date(2002, 12, 4).weekday() == 2 , a Wednesday. Lihat juga isoweekday() .

Kembalikan hari dalam seminggu sebagai bilangan bulat, di mana Senin adalah 1 dan Minggu adalah 7. Misalnya, date(2002, 12, 4).isoweekday() == 3 , a Wednesday. Lihat juga hari kerja() , isocalendar() .

Kembalikan objek Tuple bernama dengan tiga komponen: year , week dan weekday .

Kalender ISO adalah varian yang banyak digunakan dari kalender Gregorian. 3

Tahun ISO terdiri dari 52 atau 53 minggu penuh, dan satu minggu dimulai pada hari Senin dan berakhir pada hari Minggu. Minggu pertama tahun ISO adalah minggu kalender (Gregorian) pertama dalam setahun yang berisi hari Kamis. Ini disebut minggu nomor 1, dan tahun ISO hari Kamis itu sama dengan tahun Gregoriannya.

Misalnya, 2004 dimulai pada hari Kamis, jadi minggu pertama ISO tahun 2004 dimulai pada Senin, 29 Des 2003 dan berakhir pada Minggu, 4 Jan 2004:

Diubah di versi 3.9: Hasil berubah dari tuple menjadi tuple bernama .

Kembalikan string yang mewakili tanggal dalam format ISO 8601, YYYY-MM-DD :

Untuk kencan d, str(d) setara dengan d.isoformat() .

Kembalikan string yang mewakili tanggal:

pada platform tempat fungsi C ctime() asli (yang time.ctime() dipanggil, tetapi date.ctime() yang tidak dipanggil) sesuai dengan standar C.

Kembalikan string yang mewakili tanggal, dikontrol oleh string format eksplisit. Kode format yang mengacu pada jam, menit, atau detik akan melihat nilai 0. Untuk daftar lengkap arahan pemformatan, lihat strftime() dan strptime() Behavior .

Sama seperti date.strftime() . Ini memungkinkan untuk menentukan string format untuk objek tanggal dalam literal string yang diformat dan saat menggunakan str.format() . Untuk daftar lengkap arahan pemformatan, lihat strftime() dan strptime() Behavior .

Contoh Penggunaan: tanggal

Contoh menghitung hari untuk suatu acara:

Lebih banyak contoh bekerja dengan tanggal :


Dukungan Unicode Python¶

Sekarang setelah Anda mempelajari dasar-dasar Unicode, kita dapat melihat fitur Unicode Python.

Tipe Tali

Sejak Python 3.0, jenis str bahasa berisi karakter Unicode, yang berarti string apa pun yang dibuat menggunakan "unicode rock!" , 'unicode rocks!' , atau sintaks string yang dikutip tiga kali disimpan sebagai Unicode.

Pengkodean default untuk kode sumber Python adalah UTF-8, jadi Anda cukup memasukkan karakter Unicode dalam literal string:

Catatan tambahan: Python 3 juga mendukung penggunaan karakter Unicode dalam pengidentifikasi:

Jika Anda tidak dapat memasukkan karakter tertentu di editor Anda atau ingin menyimpan kode sumber ASCII saja karena alasan tertentu, Anda juga dapat menggunakan urutan escape dalam literal string. (Tergantung pada sistem Anda, Anda mungkin melihat glyph modal-delta yang sebenarnya alih-alih melarikan diri.)

Selain itu, seseorang dapat membuat string menggunakan metode decode() dari byte . Metode ini membutuhkan waktu pengkodean argumen, seperti UTF-8 , dan secara opsional an kesalahan argumen.

NS kesalahan argumen menentukan respons ketika string input tidak dapat dikonversi sesuai dengan aturan pengkodean. Nilai legal untuk argumen ini adalah 'strict' (menaikkan pengecualian UnicodeDecodeError), 'replace' (gunakan U+FFFD , REPLACEMENT CHARACTER ), 'ignore' (biarkan saja karakter dari hasil Unicode), atau 'backslashreplace' (sisipkan urutan pelarian xNN). Contoh berikut menunjukkan perbedaannya:

Pengkodean ditentukan sebagai string yang berisi nama penyandian. Python hadir dengan sekitar 100 penyandian berbeda, lihat Referensi Pustaka Python di Pengodean Standar untuk daftar. Beberapa penyandian memiliki beberapa nama misalnya, 'latin-1' , 'iso_8859_1' dan '8859 ' semuanya sinonim untuk penyandian yang sama.

String Unicode satu karakter juga dapat dibuat dengan fungsi bawaan chr(), yang mengambil bilangan bulat dan mengembalikan string Unicode dengan panjang 1 yang berisi titik kode yang sesuai. Operasi sebaliknya adalah fungsi ord() bawaan yang mengambil string Unicode satu karakter dan mengembalikan nilai titik kode:

Mengonversi ke Byte

Metode kebalikan dari byte.decode() adalah str.encode() , yang mengembalikan representasi byte dari string Unicode, yang dikodekan dalam pengkodean.

NS kesalahan parameter sama dengan parameter metode decode() tetapi mendukung beberapa kemungkinan penangan lainnya. Selain 'strict' , 'ignore' , dan 'replace' (yang dalam hal ini menyisipkan tanda tanya alih-alih karakter yang tidak dapat dikodekan), ada juga 'xmlcharrefreplace' (menyisipkan referensi karakter XML), backslashreplace (menyisipkan uNNNN escape sequence) dan namereplace (menyisipkan N <. >escape sequence).

Contoh berikut menunjukkan hasil yang berbeda:

Rutinitas tingkat rendah untuk mendaftar dan mengakses pengkodean yang tersedia ditemukan dalam modul codec. Menerapkan pengkodean baru juga membutuhkan pemahaman modul codec. Namun, fungsi encoding dan decoding yang dikembalikan oleh modul ini biasanya lebih rendah daripada yang bisa dilakukan, dan menulis encoding baru adalah tugas khusus, jadi modul tidak akan dibahas dalam HOWTO ini.

Literal Unicode dalam Kode Sumber Python¶

Dalam kode sumber Python, titik kode Unicode tertentu dapat ditulis menggunakan urutan escape, yang diikuti oleh empat digit heksagonal yang memberikan titik kode. Urutan escape U serupa, tetapi mengharapkan delapan digit heksagonal, bukan empat:

Menggunakan urutan pelarian untuk poin kode yang lebih besar dari 127 baik-baik saja dalam dosis kecil, tetapi menjadi gangguan jika Anda menggunakan banyak karakter beraksen, seperti yang Anda lakukan dalam program dengan pesan dalam bahasa Prancis atau bahasa lain yang menggunakan aksen. Anda juga dapat merakit string menggunakan fungsi bawaan chr(), tetapi ini bahkan lebih membosankan.

Idealnya, Anda ingin dapat menulis literal dalam penyandian alami bahasa Anda. Anda kemudian dapat mengedit kode sumber Python dengan editor favorit Anda yang akan menampilkan karakter beraksen secara alami, dan menggunakan karakter yang tepat saat runtime.

Python mendukung penulisan kode sumber dalam UTF-8 secara default, tetapi Anda dapat menggunakan hampir semua penyandian jika Anda menyatakan penyandian sedang digunakan. Ini dilakukan dengan memasukkan komentar khusus sebagai baris pertama atau kedua dari file sumber:

Sintaksnya terinspirasi oleh notasi Emacs untuk menentukan variabel lokal ke file. Emacs mendukung banyak variabel berbeda, tetapi Python hanya mendukung 'coding'. Simbol -*- menunjukkan kepada Emacs bahwa komentar itu spesial, mereka tidak memiliki arti penting bagi Python tetapi merupakan konvensi. Python mencari coding: name atau coding=name di komentar.

Jika Anda tidak menyertakan komentar seperti itu, penyandian default yang digunakan adalah UTF-8 seperti yang telah disebutkan. Lihat juga PEP 263 untuk informasi lebih lanjut.

Properti Unicode

Spesifikasi Unicode mencakup database informasi tentang poin kode. Untuk setiap titik kode yang ditentukan, informasinya mencakup nama karakter, kategorinya, nilai numerik jika berlaku (untuk karakter yang mewakili konsep numerik seperti angka Romawi, pecahan seperti sepertiga dan empat perlima, dll.). Ada juga properti terkait tampilan, seperti cara menggunakan titik kode dalam teks dua arah.

Program berikut menampilkan beberapa informasi tentang beberapa karakter, dan mencetak nilai numerik dari satu karakter tertentu:

Kode kategori adalah singkatan yang menggambarkan sifat karakter. Ini dikelompokkan ke dalam kategori seperti "Surat", "Nomor", "Tanda Baca", atau "Simbol", yang pada gilirannya dipecah menjadi subkategori. Untuk mengambil kode dari output di atas, 'Ll' berarti 'Huruf, huruf kecil', 'Tidak' berarti "Angka, lainnya", 'Mn' adalah "Tandai, tanpa spasi", dan 'Jadi' adalah "Simbol, lainnya". Lihat bagian Nilai Kategori Umum dari dokumentasi Basis Data Karakter Unicode untuk daftar kode kategori.

Membandingkan String¶

Unicode menambahkan beberapa komplikasi untuk membandingkan string, karena set karakter yang sama dapat diwakili oleh urutan titik kode yang berbeda. Misalnya, huruf seperti 'ê' dapat direpresentasikan sebagai titik kode tunggal U+00EA, atau sebagai U+0065 U+0302, yang merupakan titik kode untuk 'e' diikuti dengan titik kode untuk 'COMBINING CIRCUMFLEX ACCENT' . Ini akan menghasilkan output yang sama saat dicetak, tetapi yang satu adalah string dengan panjang 1 dan yang lainnya dengan panjang 2.

Salah satu alat untuk perbandingan case-insensitive adalah metode string casefold() yang mengubah string menjadi bentuk case-insensitive mengikuti algoritme yang dijelaskan oleh Unicode Standard. Algoritma ini memiliki penanganan khusus untuk karakter seperti huruf Jerman ‘ß’ (titik kode U+00DF), yang menjadi pasangan huruf kecil ‘ss’.

Alat kedua adalah fungsi normalize() modul unicodedata yang mengubah string menjadi salah satu dari beberapa bentuk normal, di mana huruf yang diikuti oleh karakter gabungan diganti dengan karakter tunggal. normalize() dapat digunakan untuk melakukan perbandingan string yang tidak akan salah melaporkan ketidaksetaraan jika dua string menggunakan penggabungan karakter secara berbeda:

Argumen pertama untuk fungsi normalize() adalah string yang memberikan bentuk normalisasi yang diinginkan, yang dapat berupa salah satu dari 'NFC', 'NFKC', 'NFD', dan 'NFKD'.

Standar Unicode juga menentukan bagaimana melakukan perbandingan caseless:

Ini akan mencetak True . (Mengapa NFD() dipanggil dua kali? Karena ada beberapa karakter yang membuat casefold() mengembalikan string yang tidak dinormalisasi, jadi hasilnya perlu dinormalisasi lagi. Lihat bagian 3.13 dari Standar Unicode untuk diskusi dan contoh. )

Ekspresi Reguler Unicode¶

Ekspresi reguler yang didukung oleh modul re dapat diberikan sebagai byte atau string. Beberapa urutan karakter khusus seperti d dan w memiliki arti yang berbeda tergantung pada apakah pola diberikan sebagai byte atau string. Misalnya, d akan cocok dengan karakter [0-9] dalam byte tetapi dalam string akan cocok dengan karakter apa pun yang ada dalam kategori 'Nd'.

String dalam contoh ini memiliki nomor 57 yang ditulis dalam angka Thailand dan Arab:

Saat dijalankan, d+ akan mencocokkan angka Thailand dan mencetaknya. Jika Anda menyediakan flag re.ASCII ke compile() , d+ akan cocok dengan substring “57” sebagai gantinya.

Demikian pula, w cocok dengan berbagai karakter Unicode tetapi hanya [a-zA-Z0-9_] dalam byte atau jika re.ASCII disediakan, dan s akan cocok dengan karakter spasi putih Unicode atau [ fv] .

Referensi¶

Beberapa diskusi alternatif yang baik tentang dukungan Unicode Python adalah:

Pragmatic Unicode, presentasi PyCon 2012 oleh Ned Batchelder.

Jenis str dijelaskan dalam referensi pustaka Python di Jenis Urutan Teks — str .

Dokumentasi untuk modul unicodedata.

Dokumentasi untuk modul codec.

Marc-André Lemburg memberikan presentasi berjudul “Python and Unicode” (slide PDF) di EuroPython 2002. Slide tersebut adalah gambaran umum yang sangat baik tentang desain fitur Unicode Python 2 (di mana tipe string Unicode disebut unicode dan literal dimulai dengan u ) .


Bilangan bulat, bilangan floating point, dan bilangan kompleks termasuk dalam kategori bilangan Python. Mereka didefinisikan sebagai kelas int , float dan kompleks dengan Python.

Kita dapat menggunakan fungsi type() untuk mengetahui kelas mana yang dimiliki variabel atau nilai. Demikian pula, fungsi isinstance() digunakan untuk memeriksa apakah suatu objek milik kelas tertentu.

Bilangan bulat dapat memiliki panjang berapa pun, hanya dibatasi oleh memori yang tersedia.

Angka floating-point akurat hingga 15 tempat desimal. Integer dan floating point dipisahkan oleh titik desimal. 1 adalah bilangan bulat, 1,0 adalah bilangan floating-point.

Bilangan kompleks ditulis dalam bentuk, x + yj , di mana x adalah bagian real dan y adalah bagian imajiner. Berikut adalah beberapa contoh.

Perhatikan bahwa variabel float b terpotong.


Berikut adalah variabel lingkungan yang penting, yang dikenali oleh Python &minus

Ini memiliki peran yang mirip dengan PATH. Variabel ini memberi tahu juru bahasa Python di mana menemukan file modul yang diimpor ke dalam suatu program. Itu harus menyertakan direktori pustaka sumber Python dan direktori yang berisi kode sumber Python. PYTHONPATH terkadang diatur oleh penginstal Python.

Ini berisi jalur file inisialisasi yang berisi kode sumber Python. Ini dijalankan setiap kali Anda memulai penerjemah. Dinamakan sebagai .pythonrc.py di Unix dan berisi perintah yang memuat utilitas atau memodifikasi PYTHONPATH.

Ini digunakan di Windows untuk menginstruksikan Python untuk menemukan kecocokan case-insensitive pertama dalam pernyataan impor. Setel variabel ini ke nilai apa pun untuk mengaktifkannya.

Ini adalah jalur pencarian modul alternatif. Biasanya disematkan di direktori PYTHONSTARTUP atau PYTHONPATH untuk memudahkan peralihan pustaka modul.


Menulis subkelas bidang¶

Saat merencanakan Bidang subclass, pertama-tama pikirkan yang ada Bidang kelas bidang baru Anda yang paling mirip dengan. Bisakah Anda mensubkelaskan bidang Django yang ada dan menghemat pekerjaan Anda sendiri? Jika tidak, Anda harus mensubkelaskan Bidang kelas, dari mana semuanya diturunkan.

Menginisialisasi bidang baru Anda adalah masalah memisahkan argumen apa pun yang khusus untuk kasus Anda dari argumen umum dan meneruskan yang terakhir ke __init__() metode dari Bidang (atau kelas orang tua Anda).

Dalam contoh kami, kami akan memanggil bidang kami HandField . (Adalah ide yang baik untuk menelepon Anda Bidang subkelas <Sesuatu>Field , sehingga mudah diidentifikasi sebagai Bidang subclass.) Itu tidak berperilaku seperti bidang yang ada, jadi kami akan mensubclass langsung dari Bidang :

Kita HandField menerima sebagian besar opsi bidang standar (lihat daftar di bawah), tetapi kami memastikannya memiliki panjang yang tetap, karena hanya perlu menampung 52 nilai kartu ditambah 104 karakter yang sesuai dengan totalnya.

Banyak dari bidang model Django menerima opsi yang tidak mereka lakukan apa-apa. Misalnya, Anda dapat melewati keduanya dapat diedit dan otomatis_sekarang untuk Django.db.models.DateField dan itu hanya akan mengabaikan dapat diedit parameter ( otomatis_sekarang diatur menyiratkan dapat diedit=Salah ). Tidak ada kesalahan yang dimunculkan dalam kasus ini.

Perilaku ini menyederhanakan kelas bidang, karena mereka tidak perlu memeriksa opsi yang tidak diperlukan. Mereka hanya meneruskan semua opsi ke kelas induk dan kemudian tidak menggunakannya nanti. Terserah Anda apakah Anda ingin bidang Anda lebih ketat tentang opsi yang mereka pilih, atau menggunakan perilaku yang lebih sederhana dan lebih permisif dari bidang saat ini.

NS __init__() metode mengambil parameter berikut:

Semua opsi tanpa penjelasan dalam daftar di atas memiliki arti yang sama seperti yang mereka lakukan untuk bidang Django normal. Lihat dokumentasi lapangan untuk contoh dan detailnya.

NS Pangkalan Subbidang kelas meta

Seperti yang kami tunjukkan dalam pendahuluan, subkelas bidang sering kali diperlukan karena dua alasan: baik untuk memanfaatkan tipe kolom database kustom, atau untuk menangani tipe Python yang kompleks. Jelas, kombinasi keduanya juga dimungkinkan. Jika Anda hanya bekerja dengan jenis kolom basis data khusus dan bidang model Anda muncul di Python sebagai jenis Python standar langsung dari backend basis data, Anda tidak perlu khawatir tentang bagian ini.

Jika Anda menangani jenis Python khusus, seperti kami Tangan kelas, kita perlu memastikan bahwa ketika Django menginisialisasi sebuah instance dari model kita dan memberikan nilai database ke atribut bidang khusus kita, kita mengubah nilai itu menjadi objek Python yang sesuai. Detail tentang bagaimana ini terjadi secara internal agak rumit, tetapi kode yang Anda butuhkan untuk menulis di . Anda Bidang class sederhana: pastikan subclass bidang Anda menggunakan metaclass khusus:

Pada Python 3, sebagai pengganti pengaturan __metaclass__ atribut, tambahkan kelas meta untuk definisi kelas:

Jika Anda ingin kode Anda berfungsi di Python 2 & 3, Anda dapat menggunakan six.with_metaclass() :

Ini memastikan bahwa to_python() metode, didokumentasikan di bawah, akan selalu dipanggil ketika atribut diinisialisasi.

ModelForm dan bidang khusus¶

Jika Anda menggunakan Pangkalan Subbidang , to_python() akan dipanggil setiap kali instance bidang diberi nilai. Ini berarti bahwa setiap kali nilai dapat ditetapkan ke bidang, Anda perlu memastikan bahwa itu akan menjadi tipe data yang benar, atau bahwa Anda menangani pengecualian apa pun.

Ini sangat penting jika Anda menggunakan ModelFormulir. Saat menyimpan ModelForm, Django akan menggunakan nilai formulir untuk membuat instance model. Namun, jika data formulir yang dibersihkan tidak dapat digunakan sebagai input yang valid ke bidang, proses validasi formulir normal akan rusak.

Oleh karena itu, Anda harus memastikan bahwa bidang formulir yang digunakan untuk mewakili bidang khusus Anda melakukan validasi input dan pembersihan data apa pun yang diperlukan untuk mengonversi input formulir yang disediakan pengguna menjadi nilai bidang model yang kompatibel dengan to_python() -. Ini mungkin memerlukan penulisan bidang formulir khusus, dan/atau menerapkan bidang formulir() metode di bidang Anda untuk mengembalikan kelas bidang formulir yang to_python() mengembalikan tipe data yang benar.

Mendokumentasikan bidang khusus Anda¶

Seperti biasa, Anda harus mendokumentasikan jenis bidang Anda, sehingga pengguna akan tahu apa itu. Selain menyediakan docstring untuk itu, yang berguna untuk pengembang, Anda juga dapat mengizinkan pengguna aplikasi admin untuk melihat deskripsi singkat tentang jenis bidang melalui django.contrib.admindocs aplikasi. Untuk melakukan ini, cukup sediakan teks deskriptif dalam a deskripsi atribut kelas dari bidang khusus Anda. Pada contoh di atas, deskripsi yang ditampilkan oleh admindocs aplikasi untuk HandField akan menjadi ‘A hand of cards (bridge style)’.

Dalam django.contrib.admindocs tampilan, deskripsi bidang diinterpolasi dengan bidang.__dict__ yang memungkinkan deskripsi untuk menggabungkan argumen bidang. Misalnya, deskripsi untuk CharField aku s:

Metode yang berguna

Setelah Anda membuat Bidang subkelas dan atur __metaclass__ , Anda dapat mempertimbangkan untuk mengganti beberapa metode standar, bergantung pada perilaku bidang Anda. Daftar metode di bawah ini kira-kira dalam urutan kepentingan yang semakin menurun, jadi mulailah dari atas.

Jenis basis data khusus¶

Mengembalikan tipe data kolom database untuk Bidang , dengan mempertimbangkan objek koneksi, dan pengaturan yang terkait dengannya.

Katakanlah Anda telah membuat jenis kustom PostgreSQL yang disebut tipe ku . Anda dapat menggunakan bidang ini dengan Django dengan membuat subkelas Bidang dan mengimplementasikan db_type() metode, seperti:

Setelah Anda memiliki MytypeField , Anda dapat menggunakannya dalam model apa pun, sama seperti model lainnya Bidang Tipe:

Jika Anda bertujuan untuk membangun aplikasi database-agnostik, Anda harus memperhitungkan perbedaan dalam tipe kolom database. Misalnya, jenis kolom tanggal/waktu di PostgreSQL disebut stempel waktu , sedangkan kolom yang sama di MySQL disebut tanggal Waktu . Cara paling sederhana untuk menangani ini di a db_type() caranya adalah dengan memeriksa connection.settings_dict['ENGINE'] atribut.

NS db_type() metode ini hanya dipanggil oleh Django ketika kerangka kerja membangun BUAT TABEL pernyataan untuk aplikasi Anda – yaitu, saat Anda pertama kali membuat tabel. Itu tidak dipanggil pada waktu lain, sehingga mampu mengeksekusi kode yang sedikit rumit, seperti connection.settings_dict periksa pada contoh di atas.

Some database column types accept parameters, such as CHAR(25) , where the parameter 25 represents the maximum column length. In cases like these, it’s more flexible if the parameter is specified in the model rather than being hard-coded in the db_type() method. For example, it wouldn’t make much sense to have a CharMaxlength25Field , shown here:

The better way of doing this would be to make the parameter specifiable at run time – i.e., when the class is instantiated. To do that, just implement django.db.models.Field.__init__() , like so:

Finally, if your column requires truly complex SQL setup, return Tidak ada dari db_type() . This will cause Django’s SQL creation code to skip over this field. You are then responsible for creating the column in the right table in some other way, of course, but this gives you a way to tell Django to get out of the way.

Converting database values to Python objects¶

Converts a value as returned by your database (or a serializer) to a Python object.

The default implementation simply returns nilai , for the common case in which the database backend already returns data in the correct format (as a Python string, for example).

If your custom Field class deals with data structures that are more complex than strings, dates, integers or floats, then you’ll need to override this method. As a general rule, the method should deal gracefully with any of the following arguments:

  • An instance of the correct type (e.g., Hand in our ongoing example).
  • A string (e.g., from a deserializer).
  • Whatever the database returns for the column type you’re using.

In our HandField class, we’re storing the data as a VARCHAR field in the database, so we need to be able to process strings and Hand instances in to_python() :

Notice that we always return a Hand instance from this method. That’s the Python object type we want to store in the model’s attribute. If anything is going wrong during value conversion, you should raise a ValidationError exception.

Remember: If your custom field needs the to_python() method to be called when it is created, you should be using The SubfieldBase metaclass mentioned earlier. Otherwise to_python() won’t be called automatically.

If your custom field allows null=True , any field method that takes nilai as an argument, like to_python() dan get_prep_value() , should handle the case when nilai aku s Tidak ada .

Converting Python objects to query values¶

This is the reverse of to_python() when working with the database backends (as opposed to serialization). NS nilai parameter is the current value of the model’s attribute (a field has no reference to its containing model, so it cannot retrieve the value itself), and the method should return data in a format that has been prepared for use as a parameter in a query.

This conversion should bukan include any database-specific conversions. If database-specific conversions are required, they should be made in the call to get_db_prep_value() .

Converting query values to database values¶

Some data types (for example, dates) need to be in a specific format before they can be used by a database backend. get_db_prep_value() is the method where those conversions should be made. The specific connection that will be used for the query is passed as the connection parameter. This allows you to use backend-specific conversion logic if it is required.

NS prepared argument describes whether or not the value has already been passed through get_prep_value() conversions. Kapan prepared is False, the default implementation of get_db_prep_value() will call get_prep_value() to do initial data conversions before performing any database-specific processing.

Same as the above, but called when the Field value must be saved to the database. As the default implementation just calls get_db_prep_value() , you shouldn’t need to implement this method unless your custom field needs a special conversion when being saved that is not the same as the conversion used for normal query parameters (which is implemented by get_db_prep_value() ).

Preprocessing values before saving¶

This method is called just prior to get_db_prep_save() and should return the value of the appropriate attribute from model_instance for this field. The attribute name is in self.attname (this is set up by Field ). If the model is being saved to the database for the first time, the Menambahkan parameter will be True , otherwise it will be False .

You only need to override this method if you want to preprocess the value somehow, just before saving. For example, Django’s DateTimeField uses this method to set the attribute correctly in the case of auto_now atau auto_now_add .

If you do override this method, you must return the value of the attribute at the end. You should also update the model’s attribute if you make any changes to the value so that code holding references to the model will always see the correct value.

Preparing values for use in database lookups¶

As with value conversions, preparing a value for database lookups is a two phase process.

get_prep_lookup() performs the first phase of lookup preparation, performing generic data validity checks

Prepares the nilai for passing to the database when used in a lookup (a WHERE constraint in SQL). NS lookup_type will be one of the valid Django filter lookups: tepat , iexact , contains , icontains , gt , gte , lt , lte , di , startswith , istartswith , endswith , iendswith , jarak , year , month , day , isnull , search , regex , dan iregex .

Your method must be prepared to handle all of these lookup_type values and should raise either a ValueError if the nilai is of the wrong sort (a list when you were expecting an object, for example) or a TypeError if your field does not support that type of lookup. For many fields, you can get by with handling the lookup types that need special handling for your field and pass the rest to the get_db_prep_lookup() method of the parent class.

If you needed to implement get_db_prep_save() , you will usually need to implement get_prep_lookup() . If you don’t, get_prep_value will be called by the default implementation, to manage tepat , gt , gte , lt , lte , di dan jarak lookups.

You may also want to implement this method to limit the lookup types that could be used with your custom field type.

Note that, for jarak dan di lookups, get_prep_lookup will receive a list of objects (presumably of the right type) and will need to convert them to a list of things of the right type for passing to the database. Most of the time, you can reuse get_prep_value() , or at least factor out some common pieces.

For example, the following code implements get_prep_lookup to limit the accepted lookup types to tepat dan di :

Performs any database-specific data conversions required by a lookup. Seperti get_db_prep_value() , the specific connection that will be used for the query is passed as the connection parameter. NS prepared argument describes whether the value has already been prepared with get_prep_lookup() .

Specifying the form field for a model field¶

Returns the default form field to use when this field is displayed in a model. This method is called by the ModelForm helper.

All of the kwargs dictionary is passed directly to the form field’s __init__() method. Normally, all you need to do is set up a good default for the form_class argument and then delegate further handling to the parent class. This might require you to write a custom form field (and even a form widget). See the forms documentation for information about this.

Continuing our ongoing example, we can write the formfield() method as:

This assumes we’ve imported a MyFormField field class (which has its own default widget). This document doesn’t cover the details of writing custom form fields.

Emulating built-in field types¶

Returns a string giving the name of the Field subclass we are emulating at the database level. This is used to determine the type of database column for simple cases.

If you have created a db_type() method, you don’t need to worry about get_internal_type() – it won’t be used much. Sometimes, though, your database storage is similar in type to some other field, so you can use that other field’s logic to create the right column.

No matter which database backend we are using, this will mean that syncdb and other SQL commands create the right column type for storing a string.

Jika get_internal_type() returns a string that is not known to Django for the database backend you are using – that is, it doesn’t appear in django.db.backends.<db_name>.creation.DATA_TYPES – the string will still be used by the serializer, but the default db_type() method will return Tidak ada . See the documentation of db_type() for reasons why this might be useful. Putting a descriptive string in as the type of the field for the serializer is a useful idea if you’re ever going to be using the serializer output in some other place, outside of Django.

Converting field data for serialization¶

This method is used by the serializers to convert the field into a string for output. Panggilan Field._get_val_from_obj(obj) is the best way to get the value to serialize. For example, since our HandField uses strings for its data storage anyway, we can reuse some existing conversion code:

Some general advice¶

Writing a custom field can be a tricky process, particularly if you’re doing complex conversions between your Python types and your database and serialization formats. Here are a couple of tips to make things go more smoothly:

  1. Look at the existing Django fields (in django/db/models/fields/__init__.py ) for inspiration. Try to find a field that’s similar to what you want and extend it a little bit, instead of creating an entirely new field from scratch.
  2. Put a __str__() atau __unicode__() method on the class you’re wrapping up as a field. There are a lot of places where the default behavior of the field code is to call force_text() on the value. (In our examples in this document, nilai would be a Hand instance, not a HandField ). So if your __unicode__() method ( __str__() on Python 3) automatically converts to the string form of your Python object, you can save yourself a lot of work.

Writing a FileField subclass¶

In addition to the above methods, fields that deal with files have a few other special requirements which must be taken into account. The majority of the mechanics provided by FileField , such as controlling database storage and retrieval, can remain unchanged, leaving subclasses to deal with the challenge of supporting a particular type of file.

Django provides a File class, which is used as a proxy to the file’s contents and operations. This can be subclassed to customize how the file is accessed, and what methods are available. It lives at django.db.models.fields.files , and its default behavior is explained in the file documentation.

Once a subclass of File is created, the new FileField subclass must be told to use it. To do so, simply assign the new File subclass to the special attr_class attribute of the FileField subclass.

A few suggestions¶

In addition to the above details, there are a few guidelines which can greatly improve the efficiency and readability of the field’s code.


Tonton videonya: Python в ArcGIS - ТОП-10 самых востребованных функций,, Esri CIS