Buku "Python. Tentu saja ekspres. Edisi ke-3.

gambar Hai, habrozhiteli! Buku ini ditujukan untuk orang-orang yang sudah memiliki pengalaman dalam satu atau lebih bahasa pemrograman dan ingin mempelajari dasar-dasar Python 3 secepat dan semudah mungkin. Diasumsikan bahwa pembaca sudah terbiasa dengan struktur kontrol, OOP, penanganan file, penanganan pengecualian, dll. e. Buku ini juga akan berguna bagi pengguna versi Python sebelumnya yang membutuhkan referensi Python 3.1 yang ringkas.

Kami mengundang Anda untuk membaca kutipan "Memproses file data"

Cara menggunakan buku


Bagian 1 memberikan informasi umum tentang Python. Anda akan belajar cara mengunduh dan menginstal Python di sistem Anda. Ini juga memberikan gambaran umum bahasa, yang akan berguna terutama untuk programmer berpengalaman yang menginginkan pemahaman tingkat tinggi tentang Python.

Bagian 2 berisi bahan utama buku ini. Ini membahas bahan-bahan yang diperlukan untuk mendapatkan keterampilan praktis dalam menggunakan Python sebagai bahasa pemrograman tujuan umum. Materi bab-bab itu direncanakan sehingga pembaca yang baru mulai belajar Python dapat bergerak maju secara berurutan, mempelajari poin-poin utama bahasa tersebut. Bagian ini juga mengandung bagian yang lebih kompleks, sehingga Anda dapat kembali dan menemukan semua informasi yang diperlukan tentang desain atau topik tertentu di satu tempat.

Bagian 3 menyajikan fitur-fitur canggih elemen bahasa Python yang tidak mutlak diperlukan, tetapi tentu akan berguna bagi programmer Python yang serius.

Bagian 4 berfokus pada topik khusus yang melampaui sintaksis sederhana bahasa. Anda dapat membaca bab-bab ini atau melewati mereka tergantung pada kebutuhan Anda.

Pemrogram pemula Python didorong untuk memulai dengan bab 3 untuk mendapatkan kesan umum, dan kemudian beralih ke bab-bab yang menarik di bagian 2. Perkenalkan contoh-contoh interaktif untuk membuat konsep. Anda juga dapat melampaui contoh-contoh yang diberikan dalam teks dan mencari jawaban untuk pertanyaan apa pun yang masih belum jelas. Pendekatan ini akan meningkatkan kecepatan belajar dan memperdalam pemahaman. Jika Anda belum terbiasa dengan OOP atau tidak diperlukan untuk aplikasi Anda, Anda dapat melewati sebagian besar bab 15.

Pembaca yang sudah terbiasa dengan Python juga harus mulai dengan bab 3. Ini memberikan gambaran pengantar yang baik dan deskripsi perbedaan antara Python 3 dan versi yang lebih akrab. Ini juga dapat digunakan untuk mengevaluasi apakah Anda siap untuk melanjutkan ke bab yang lebih kompleks dari bagian 3 dan 4 buku ini.

Mungkin beberapa pembaca yang tidak berpengalaman dengan Python tetapi yang memiliki pengalaman yang cukup dalam bahasa pemrograman lain akan dapat memperoleh sebagian besar informasi yang diperlukan dengan membaca Bab 3 dan melihat modul perpustakaan standar Python (Bab 19) dan manual referensi perpustakaan Python dalam dokumentasi Python .

Kutipan. Pemrosesan file data


Sebagian besar data didistribusikan dalam file teks. Ini bisa berupa teks yang tidak terstruktur (misalnya, kumpulan pesan atau kumpulan teks sastra), atau lebih banyak data terstruktur, di mana setiap baris adalah catatan, dan bidang dipisahkan oleh karakter pemisah khusus - koma, karakter tab atau bar vertikal (|). File teks bisa sangat besar; kumpulan data dapat menempati puluhan atau bahkan ratusan file, dan data yang terkandung di dalamnya mungkin tidak lengkap atau terdistorsi. Dengan variasi seperti itu, Anda hampir pasti akan menghadapi tugas membaca dan menggunakan data dari file teks. Bab ini menyajikan strategi dasar untuk menyelesaikan masalah ini dengan Python.

21.1. Memperkenalkan ETL


Kebutuhan untuk mengekstrak data dari file, parsing, mengonversinya ke format yang mudah, dan kemudian melakukan sesuatu yang muncul hampir bersamaan dengan file data. Selain itu, bahkan ada istilah standar untuk proses ini: ETL (Extract-Transform-Load, yaitu, "ekstraksi - transformasi - pemuatan"). Pengambilan mengacu pada proses membaca sumber data dan menguraikannya jika perlu. Konversi mungkin melibatkan pembersihan dan normalisasi data, serta menggabungkan, memecah, dan mengatur ulang catatan yang dikandungnya. Akhirnya, memuat berarti menyimpan data yang dikonversi di tempat baru (dalam file atau database lain). Bab ini membahas dasar-dasar penerapan ETL dengan Python, dari file data teks hingga menyimpan data yang dikonversi di file lain. Lebih banyak file data terstruktur dibahas dalam bab 22, dan penyimpanan informasi dalam database dibahas dalam bab 23.

21.2. Membaca file teks


Komponen pertama ETL - ekstraksi - melibatkan membuka file dan membaca isinya. Sekilas, kedengarannya sederhana, tetapi bahkan di sini masalah mungkin muncul - misalnya, ukuran file. Jika file terlalu besar untuk dapat ditampung dalam memori, kode harus terstruktur sehingga berfungsi dengan segmen file yang lebih kecil (mungkin satu baris).

21.2.1. Pengkodean teks: ASCII, Unicode, dan lainnya


Masalah lain yang mungkin terjadi adalah pengodean. Bab ini dikhususkan untuk bekerja dengan file teks, dan pada kenyataannya, sebagian besar data yang dikirim di dunia nyata disimpan dalam file teks. Namun, sifat teks yang tepat dapat bervariasi tergantung pada aplikasi, pengguna, dan, tentu saja, negara.

Terkadang teks membawa informasi dalam pengkodean ASCII, termasuk 128 karakter, hanya 95 yang diklasifikasikan sebagai dapat dicetak. Untungnya, pengkodean ASCII adalah "kelipatan paling tidak umum" dari sebagian besar situasi transfer data. Di sisi lain, ia tidak dapat mengatasi kompleksitas berbagai huruf dan sistem penulisan yang ada di dunia. Membaca file dalam pengkodean ASCII hampir pasti akan mengarah pada kenyataan bahwa ketika membaca karakter yang tidak didukung, baik itu Jerman ü, Portugis ç atau hampir semua karakter dari bahasa selain bahasa Inggris, masalah akan mulai dan kesalahan akan muncul.

Kesalahan ini terjadi karena ASCII menggunakan nilai 7-bit, sedangkan byte dalam file khas terdiri dari 8 bit, yang memungkinkan 256 nilai yang mungkin untuk diwakili, bukan 128 untuk nilai 7-bit. Kode tambahan ini biasanya digunakan untuk menyimpan nilai tambahan - dari tanda baca yang diperluas (seperti tanda hubung menengah dan pendek) ke berbagai karakter (merek dagang, tanda hak cipta dan tanda derajat) dan versi karakter alfabet dengan tanda diakritik. Selalu ada satu masalah: ketika membaca file teks, Anda bisa menemukan karakter yang melampaui kisaran ASCII 128 karakter, dan Anda tidak bisa memastikan karakter mana yang dikodekan. Misalkan Anda menemukan karakter dengan kode 214. Apa itu? Tanda pembagian, huruf Ö atau yang lainnya? Tanpa kode sumber yang membuat file ini, tidak mungkin untuk mengetahuinya.

Unicode dan UTF-8


Untuk menghilangkan ambiguitas ini, Anda dapat menggunakan Unicode. Pengkodean Unicode, disebut UTF-8, mendukung karakter ASCII dasar tanpa perubahan apa pun, tetapi juga memungkinkan serangkaian karakter dan karakter lain yang hampir tidak terbatas dari standar Unicode. Karena fleksibilitasnya, UTF-8 digunakan di lebih dari 85% halaman web yang ada pada saat penulisan ini. Ini berarti bahwa ketika membaca file teks yang terbaik adalah fokus pada UTF-8. Jika file hanya berisi karakter ASCII, mereka akan dibaca dengan benar, tetapi Anda juga mendapatkan asuransi jika karakter lain dikodekan dalam UTF-8. Untungnya, tipe data string Python 3 dirancang untuk mendukung Unicode secara default.

Bahkan dengan Unicode, situasi dimungkinkan ketika nilai muncul dalam teks yang tidak dapat berhasil diterjemahkan. Fungsi terbuka di Python menerima parameter kesalahan tambahan, yang menentukan cara menangani kesalahan pengkodean saat membaca atau menulis file. Nilai defaultnya adalah 'ketat', yang memicu kesalahan setiap kali kesalahan pengkodean terdeteksi. Nilai berguna lainnya adalah 'abaikan' (lewati karakter yang menyebabkan kesalahan); 'replace' (karakter diganti dengan spidol khusus - biasanya?); 'backslashreplace' (karakter diganti dengan urutan escape dengan \) dan 'surrogateescape' (karakter penyusup dikonversi ke titik kode Unicode pribadi saat membaca dan kembali ke urutan byte asli saat menulis). Pilihan metode untuk memproses atau menyelesaikan kesalahan pengkodean tergantung pada situasi tertentu.

Pertimbangkan contoh singkat dari file yang berisi karakter UTF-8 yang tidak valid, dan lihat bagaimana karakter ini diproses dalam mode yang berbeda. Pertama-tama tulis file menggunakan byte dan mode biner:

>>> open('test.txt', 'wb').write(bytes([65, 66, 67, 255, 192,193])) 

Sebagai hasil dari perintah, file dibuat dari karakter "ABC", diikuti oleh tiga karakter yang tidak termasuk dalam ASCII, yang dapat ditampilkan secara berbeda tergantung pada metode pengkodean yang digunakan. Jika Anda menggunakan vim untuk melihat file, hasilnya akan terlihat seperti ini:

 ABCÿÀÁ ~ 


Saat file dibuat, coba baca dalam mode penanganan kesalahan ketat standar:

 >>> x = open('test.txt').read() Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/local/lib/python3.6/codecs.py", line 321, in decode (result, consumed) = self._buffer_decode(data, self.errors, final) UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 3: invalid start byte 


Byte keempat dengan nilai 255 bukan karakter UTF-8 yang valid pada posisi ini, sehingga pengecualian terjadi dalam mode 'ketat'. Sekarang mari kita lihat bagaimana mode penanganan kesalahan lainnya berurusan dengan file yang sama, tidak lupa bahwa tiga karakter terakhir memicu kesalahan:

gambar

Jika Anda ingin karakter yang bermasalah menghilang begitu saja, gunakan mode 'abaikan'. Mode 'ganti' hanya menandai posisi karakter yang tidak valid, sementara mode lain mencoba berbeda untuk menyimpan karakter yang tidak valid tanpa interpretasi.

21.2.2. Teks tidak terstruktur


File teks tidak terstruktur terbaca paling mudah, tetapi mereka juga menciptakan masalah paling besar dengan mengekstraksi informasi. Pemrosesan teks yang tidak terstruktur dapat sangat bervariasi tergantung pada sifat teks dan apa yang akan Anda lakukan dengannya, sehingga setiap diskusi terperinci tentang pemrosesan teks berada di luar cakupan buku ini. Namun, contoh singkat akan membantu menunjukkan beberapa masalah dasar dan meletakkan dasar untuk membahas file dengan data teks terstruktur.

Salah satu masalah paling sederhana adalah memilih unit logis dasar dalam file. Jika Anda menggunakan koleksi ribuan pesan Twitter, teks Moby Dick, atau kumpulan berita, Anda perlu memecahnya menjadi beberapa blok. Dalam kasus tweet, setiap blok dapat ditempatkan pada satu baris, dan membaca dan memproses setiap baris file diatur dengan cukup sederhana.

Dalam kasus Moby Dick dan bahkan beberapa berita, masalahnya semakin rumit. Tentu saja, teks novel dan bahkan teks berita biasanya tidak diinginkan untuk dipertimbangkan sebagai satu kesatuan. Dalam hal ini, Anda perlu memutuskan blok mana yang Anda butuhkan, dan kemudian mengembangkan strategi untuk membagi file menjadi blok. Anda mungkin lebih suka memproses paragraf teks dengan paragraf. Dalam hal ini, Anda harus menentukan bagaimana penguraian teks menjadi paragraf dalam file diatur, dan menulis kode sesuai. Jika paragraf cocok dengan baris file teks, ini tidak akan sulit. Namun, seringkali satu paragraf file teks dapat terdiri dari beberapa baris dalam file teks, dan Anda harus bekerja keras.

Sekarang perhatikan beberapa contoh.

Panggil aku Ismail. Beberapa tahun yang lalu - tidak peduli berapa lama tepatnya--
memiliki sedikit atau tidak ada uang di dompet saya, dan tidak ada yang khusus
untuk menarik minat saya di pantai, saya pikir saya akan berlayar sedikit
dan melihat bagian dunia yang berair. Ini adalah cara yang saya miliki
mengusir limpa dan mengatur sirkulasi.
Setiap kali saya merasa muram tentang mulut;
setiap kali bulan November lembab, gerimis di dalam jiwaku; setiap kali saya
menemukan diri saya tanpa sadar berhenti sebelum gudang peti mati,
dan membuka bagian belakang setiap pemakaman yang saya temui;
dan terutama setiap kali hypos saya lebih unggul dari saya,
bahwa itu membutuhkan prinsip moral yang kuat untuk mencegah saya
sengaja melangkah ke jalan, dan secara sistematis mengetuk
topi orang off - maka, saya memperhitungkan sudah saatnya untuk melaut
secepat aku bisa. Ini pengganti saya untuk pistol dan bola.
Dengan gaya filosofis, Cato melemparkan dirinya ke atas pedangnya;
Diam-diam aku naik ke kapal. Tidak ada yang mengejutkan dalam hal ini.
Jika mereka mengetahuinya, hampir semua pria dalam derajat mereka, suatu saat
atau lainnya, hargai perasaan yang hampir sama terhadap
samudra bersamaku.

Sekarang ada kota terpencil Anda di Manhattoes, yang diikat oleh dermaga
sebagai pulau-pulau India oleh terumbu karang - perdagangan mengelilinginya dengan ombaknya.
Kanan dan kiri, jalanan membawa Anda ke perairan. Pusat kota yang ekstrem
adalah baterai, tempat tahi lalat bangsawan itu dicuci oleh gelombang, dan didinginkan
oleh angin, yang beberapa jam sebelumnya tidak terlihat dari tanah.
Lihatlah kerumunan tukang air di sana.

Dalam contoh ini (dengan awal teks "Moby Dick"), garis-garis dipecah kurang lebih seperti mereka akan paginasi, dan paragraf ditunjukkan oleh satu baris kosong. Jika Anda ingin memperlakukan setiap paragraf secara keseluruhan, Anda perlu memecah teks menjadi baris kosong. Untungnya, tugas ini mudah diselesaikan dengan metode string split (). Setiap baris baru dalam teks diwakili oleh kombinasi "\ n". Secara alami, baris terakhir teks dari setiap paragraf berakhir dengan baris baru, dan jika baris berikutnya kosong, maka baris kedua segera mengikutinya:

gambar

Memilah teks ke dalam paragraf adalah langkah yang sangat sederhana dalam pemrosesan teks yang tidak terstruktur. Anda mungkin juga perlu melakukan normalisasi teks tambahan sebelum diproses lebih lanjut. Misalkan Anda ingin menghitung frekuensi kemunculan setiap kata dalam file teks. Jika Anda hanya membagi file dengan kelalaian, Anda akan mendapatkan daftar kata dalam file, namun, menghitung secara akurat kejadian tidak akan begitu sederhana karena ini, ini, ini. dan ini, tidak akan dianggap kata yang sama. Agar kode ini berfungsi dengan benar, perlu untuk menormalkan teks dengan menghapus tanda baca dan mengubah semua teks menjadi satu case sebelum diproses. Dalam contoh teks di atas, kode untuk membangun daftar kata yang dinormalisasi mungkin terlihat seperti ini:

gambar

21.2.3. File Terbatas yang Tidak Terstruktur


File tidak terstruktur dibaca dengan sangat sederhana, tetapi kekurangan struktur juga kelemahannya. Seringkali lebih mudah untuk mendefinisikan beberapa struktur file untuk menyederhanakan pemilihan nilai individual. Dalam versi paling sederhana, file dibagi menjadi beberapa baris, dan setiap baris berisi satu elemen informasi. Misalnya, itu bisa berupa daftar nama file untuk diproses, daftar nama orang atau serangkaian pembacaan suhu dari sensor jarak jauh. Dalam kasus seperti itu, analisis data diatur dengan sangat sederhana: Anda membaca baris dan, jika perlu, mengubahnya ke jenis yang diinginkan. Ini semua yang diperlukan untuk mendapatkan file siap digunakan.

Namun, situasinya tidak sesederhana itu. Lebih sering Anda perlu mengelompokkan beberapa elemen data yang saling berhubungan, dan kode Anda harus membacanya bersama. Biasanya, untuk ini, data terkait ditempatkan pada satu baris dan dipisahkan oleh karakter khusus. Dalam hal ini, saat membaca setiap baris file, karakter khusus digunakan untuk membagi data menjadi bidang dan menyimpan nilai bidang dalam variabel untuk diproses lebih lanjut.

File berikut ini berisi data suhu dalam format terbatas:

 State|Month Day, Year Code|Avg Daily Max Air Temperature (F)|Record Count for Daily Max Air Temp (F) Illinois|1979/01/01|17.48|994 Illinois|1979/01/02|4.64|994 Illinois|1979/01/03|11.05|994 Illinois|1979/01/04|9.51|994 Illinois|1979/05/15|68.42|994 Illinois|1979/05/16|70.29|994 Illinois|1979/05/17|75.34|994 Illinois|1979/05/18|79.13|994 Illinois|1979/05/19|74.94|994 

Data dalam file dipisahkan oleh pipa (|). Dalam contoh ini, mereka terdiri dari empat bidang: negara, tanggal pengamatan, suhu maksimum rata-rata dan jumlah stasiun yang memasok data. Pembatas standar lainnya adalah karakter tab dan koma. Mungkin koma paling sering digunakan, tetapi pemisah dapat berupa karakter apa pun yang tidak akan muncul dalam nilai (lebih lanjut tentang itu nanti). Data yang dipisahkan koma sangat umum sehingga format ini sering disebut CSV (Comma-Separated Values, yaitu, data yang dipisahkan koma), dan file jenis ini disediakan dengan ekstensi .csv sebagai atribut format.

Apa pun karakter yang digunakan sebagai pembatas, jika Anda tahu apa karakternya, Anda dapat menulis kode Python Anda sendiri untuk membagi string menjadi bidang dan mengembalikannya sebagai daftar. Dalam kasus sebelumnya, Anda bisa menggunakan metode split () untuk mengonversi string ke daftar nilai:

 >>> line = "Illinois|1979/01/01|17.48|994" >>> print(line.split("|")) ['Illinois', '1979/01/01', '17.48', '994'] 

Teknik ini sangat mudah diimplementasikan, tetapi semua nilai disimpan dalam bentuk string, dan ini mungkin tidak nyaman untuk diproses selanjutnya.

21.2.4. Modul Csv


Jika Anda sering harus memproses file data yang dibatasi, Anda harus melihat lebih dekat pada modul csv dan kemampuannya. Ketika saya diminta untuk memberi nama modul favorit saya dari pustaka standar Python, saya memanggil modul csv lebih dari sekali - bukan karena modul itu terlihat spektakuler (tidak), tetapi karena itu mungkin menyelamatkan saya lebih banyak waktu dan menyelamatkan saya dari potensi kesalahan saya lebih sering daripada modul lainnya.
Modul csv adalah contoh sempurna dari filosofi "termasuk baterai" Python. Meskipun Anda dapat dengan sempurna menulis kode Anda sendiri untuk membaca file yang dibatasi (apalagi, tidak begitu sulit), itu jauh lebih mudah dan lebih dapat diandalkan untuk menggunakan modul Python. Modul csv telah diuji dan dioptimalkan, dan ia menyediakan sejumlah fitur yang sulit Anda terapkan sendiri, tetapi yang bagaimanapun cukup nyaman dan menghemat waktu.

Lihatlah data sebelumnya dan putuskan bagaimana Anda akan membacanya dengan modul csv. Kode parsing data harus membaca setiap baris dan menghapus karakter baris baru, dan kemudian membaginya dengan karakter | dan menambahkan daftar nilai ke daftar string umum. Solusinya mungkin terlihat seperti ini:

 >>> results = [] >>> for line in open("temp_data_pipes_00a.txt"): ... fields = line.strip().split("|") ... results.append(fields) ... >>> results [['State', 'Month Day, Year Code', 'Avg Daily Max Air Temperature (F)', 'Record Count for Daily Max Air Temp (F)'], ['Illinois', '1979/01/01', '17.48', '994'], ['Illinois', '1979/01/02', '4.64', '994'], ['Illinois', '1979/01/03', '11.05', '994'], ['Illinois', '1979/01/04', '9.51', '994'], ['Illinois', '1979/05/15', '68.42', '994'], ['Illinois', '1979/ 05/16', '70.29', '994'], ['Illinois', '1979/05/17', '75.34', '994'], ['Illinois', '1979/05/18', '79.13', '994'], ['Illinois', '1979/05/19', '74.94', '994']] 

Jika Anda ingin melakukan hal yang sama dengan modul csv, kode tersebut mungkin terlihat seperti ini:

 >>> import csv >>> results = [fields for fields in csv.reader(open("temp_data_pipes_00a.txt", newline=''), delimiter="|")] >>> results [['State', 'Month Day, Year Code', 'Avg Daily Max Air Temperature (F)', 'Record Count for Daily Max Air Temp (F)'], ['Illinois', '1979/01/01', '17.48', '994'], ['Illinois', '1979/01/02', '4.64', '994'], ['Illinois', '1979/01/03', '11.05', '994'], ['Illinois', '1979/01/04', '9.51', '994'], ['Illinois', '1979/05/15', '68.42', '994'], ['Illinois', '1979/ 05/16', '70.29', '994'], ['Illinois', '1979/05/17', '75.34', '994'], ['Illinois', '1979/05/18', '79.13', '994'], ['Illinois', '1979/05/19', '74.94', '994']] 

Dalam kasus sederhana ini, keuntungan dibandingkan dengan implementasi independen dari solusi tidak begitu besar. Namun demikian, kode tersebut ternyata dua baris lebih pendek dan sedikit lebih jelas, dan Anda tidak perlu khawatir memotong karakter baris baru. Keuntungan nyata datang ketika Anda menghadapi kasus yang lebih kompleks.

Data dalam contoh ini adalah nyata, tetapi dalam kenyataannya telah disederhanakan dan dibersihkan. Data nyata dari sumber akan lebih kompleks. Data nyata berisi lebih banyak bidang, beberapa bidang akan dilampirkan dalam tanda kutip, yang lain tidak, dan bidang pertama mungkin kosong. Dokumen asli dipisahkan oleh tab, tetapi untuk tujuan demonstrasi, saya kutip dipisahkan dengan koma:

 "Notes","State","State Code","Month Day, Year","Month Day, Year Code",Avg Daily Max Air Temperature (F),Record Count for Daily Max Air Temp (F),Min Temp for Daily Max Air Temp (F),Max Temp for Daily Max Air Temp (F),Avg Daily Max Heat Index (F),Record Count for Daily Max Heat Index (F),Min for Daily Max Heat Index (F),Max for Daily Max Heat Index (F),Daily Max Heat Index (F) % Coverage ,"Illinois","17","Jan 01, 1979","1979/01/ 01",17.48,994,6.00,30.50,Missing,0,Missing,Missing,0.00% ,"Illinois","17","Jan 02, 1979","1979/01/02",4.64,994,- 6.40,15.80,Missing,0,Missing,Missing,0.00% ,"Illinois","17","Jan 03, 1979","1979/01/03",11.05,994,- 0.70,24.70,Missing,0,Missing,Missing,0.00% ,"Illinois","17","Jan 04, 1979","1979/01/ 04",9.51,994,0.20,27.60,Missing,0,Missing,Missing,0.00% ,"Illinois","17","May 15, 1979","1979/05/ 15",68.42,994,61.00,75.10,Missing,0,Missing,Missing,0.00% ,"Illinois","17","May 16, 1979","1979/05/ 16",70.29,994,63.40,73.50,Missing,0,Missing,Missing,0.00% ,"Illinois","17","May 17, 1979","1979/05/ 17",75.34,994,64.00,80.50,82.60,2,82.40,82.80,0.20% ,"Illinois","17","May 18, 1979","1979/05/ 18",79.13,994,75.50,82.10,81.42,349,80.20,83.40,35.11% ,"Illinois","17","May 19, 1979","1979/05/ 19",74.94,994,66.90,83.10,82.87,78,81.60,85.20,7.85% 

Harap dicatat: beberapa bidang termasuk koma. Menurut aturan dalam kasus seperti itu, bidang dilampirkan dalam tanda kutip untuk menunjukkan bahwa isinya tidak dimaksudkan untuk diuraikan dan mencari pembatas. Dalam praktiknya (seperti dalam kasus ini), hanya sebagian kecil dari bidang yang sering dilampirkan dalam tanda kutip, terutama yang nilainya mungkin mengandung pemisah. Namun (seperti lagi dalam contoh ini), beberapa bidang dilampirkan dalam tanda kutip bahkan ketika mereka tidak mungkin mengandung pemisah.

Dalam kasus seperti itu, solusi rumahan menjadi terlalu rumit. Sekarang hanya melanggar garis dengan karakter pembatas tidak lagi berfungsi; Anda perlu memastikan bahwa Anda hanya menggunakan pemisah yang tidak ada di dalam string. Selain itu, Anda harus menghapus tanda kutip, yang mungkin berada dalam posisi sewenang-wenang atau tidak ditemukan di mana pun. Dengan modul csv, Anda tidak perlu mengubah kode sama sekali. Selain itu, karena koma dianggap sebagai pemisah default, koma bahkan tidak perlu ditentukan:

 >>> results2 = [fields for fields in csv.reader(open("temp_data_01.csv", newline=''))] >>> results2 [['Notes', 'State', 'State Code', 'Month Day, Year', 'Month Day, Year Code', 'Avg Daily Max Air Temperature (F)', 'Record Count for Daily Max Air Temp (F)', 'Min Temp for Daily Max Air Temp (F)', 'Max Temp for Daily Max Air Temp (F)', 'Avg Daily Min Air Temperature (F)', 'Record Count for Daily Min Air Temp (F)', 'Min Temp for Daily Min Air Temp (F)', 'Max Temp for Daily Min Air Temp (F)', 'Avg Daily Max Heat Index (F)', 'Record Count for Daily Max Heat Index (F)', 'Min for Daily Max Heat Index (F)', 'Max for Daily Max Heat Index (F)', 'Daily Max Heat Index (F) % Coverage'], ['', 'Illinois', '17', 'Jan 01, 1979', '1979/01/01', '17.48', '994', '6.00', '30.50', '2.89', '994', '-13.60', '15.80', 'Missing', '0', 'Missing', 'Missing', '0.00%'], ['', 'Illinois', '17', 'Jan 02, 1979', '1979/01/02', '4.64', '994', '-6.40', '15.80', '-9.03', '994', '-23.60', '6.60', 'Missing', '0', 'Missing', 'Missing', '0.00%'], ['', 'Illinois', '17', 'Jan 03, 1979', '1979/01/03', '11.05', '994', '- 0.70', '24.70', '-2.17', '994', '-18.30', '12.90', 'Missing', '0', 'Missing', 'Missing', '0.00%'], ['', 'Illinois', '17', 'Jan 04, 1979', '1979/01/04', '9.51', '994', '0.20', '27.60', '-0.43', '994', '-16.30', '16.30', 'Missing', '0', 'Missing', 'Missing', '0.00%'], ['', 'Illinois', '17', 'May 15, 1979', '1979/05/15', '68.42', '994', '61.00', '75.10', '51.30', '994', '43.30', '57.00', 'Missing', '0', 'Missing', 'Missing', '0.00%'], ['', 'Illinois', '17', 'May 16, 1979', '1979/05/ 16', '70.29', '994', '63.40', '73.50', '48.09', '994', '41.10', '53.00', 'Missing', '0', 'Missing', 'Missing', '0.00%'], ['', 'Illinois', '17', 'May 17, 1979', '1979/05/17', '75.34', '994', '64.00', '80.50', '50.84', '994', '44.30', '55.70', '82.60', '2', '82.40', '82.80', '0.20%'], ['', 'Illinois', '17', 'May 18, 1979', '1979/05/18', '79.13', '994', '75.50', '82.10', '55.68', '994', '50.00', '61.10', '81.42', '349', '80.20', '83.40', '35.11%'], ['', 'Illinois', '17', 'May 19, 1979', '1979/05/19', '74.94', '994', '66.90', '83.10', '58.59', '994', '50.90', '63.20', '82.87', '78', '81.60', '85.20', '7.85%']] 


»Informasi lebih lanjut tentang buku ini dapat ditemukan di situs web penerbit
» Isi
» Kutipan

Kupon diskon 20% untuk penjaja - Python

Source: https://habr.com/ru/post/id437050/


All Articles