Saya meminta Python untuk mencetak angka minimum dari kolom data CSV, tetapi baris teratas adalah nomor kolom, dan saya tidak ingin Python memperhitungkan baris atas. Bagaimana saya bisa memastikan Python mengabaikan baris pertama?
Ini kodenya sejauh ini:
import csv
with open('all16.csv', 'rb') as inf:
incsv = csv.reader(inf)
column = 1
datatype = float
data = (datatype(column) for row in incsv)
least_value = min(data)
print least_value
Bisakah Anda juga menjelaskan apa yang Anda lakukan, tidak hanya memberikan kodenya? Saya sangat baru mengenal Python dan ingin memastikan bahwa saya memahami segalanya.
1.0
untuk setiap baris dalam file Anda dan kemudian mengambil nilai minimum, yang mana yang akan menjadi1.0
?1.0
. :)datatype(row[column]
... adalah apa yang saya kira OP sedang coba capaiJawaban:
Anda dapat menggunakan instance kelas
csv
modulSniffer
untuk menyimpulkan format file CSV dan mendeteksi apakah baris header ada bersama dengannext()
fungsi bawaan untuk melewati baris pertama hanya jika diperlukan:Karena
datatype
dan dicolumn
-hardcode dalam contoh Anda, akan sedikit lebih cepat untuk memprosesrow
seperti ini:Catatan: kode di atas adalah untuk Python 3.x. Untuk Python 2.x gunakan baris berikut untuk membuka file alih-alih yang ditampilkan:
sumber
has_header(file.read(1024))
, apakah masuk akal untuk menulishas_header(file.readline())
? Saya sering melihat itu, tetapi saya tidak mengerti bagaimanahas_reader()
bisa mendeteksi apakah ada header dari satu baris file CSV ...Sniffer
karya - karya itu tidak dijelaskan. FWIW Saya belum pernah melihathas_header(file.readline())
digunakan dan bahkan jika itu berhasil sebagian besar waktu, saya akan sangat curiga dengan pendekatan tersebut karena alasan yang disebutkan.file.read(1024)
menghasilkan kesalahan dalam python's csv lib :. Lihat juga di sini misalnya.readline()
keread(1024)
. Sejauh ini saya hanya berhasil menemukan orang yang telah beralih ke readline untuk menyelesaikan masalah csv.dialect.Untuk melewati baris pertama, panggil saja:
File dengan Python adalah iterator di atas baris.
sumber
Dalam kasus penggunaan serupa saya harus melewati baris yang mengganggu sebelum baris dengan nama kolom saya yang sebenarnya. Solusi ini bekerja dengan baik. Baca file terlebih dahulu, lalu teruskan daftarnya ke
csv.DictReader
.sumber
data
kamus, juga tidak jawaban ini benar-benar menambahkan apa pun selain yang diterima.data = dict()
dan mengisinya, tetapi ini tidak efisien dan tidak idiomatis. Plus, seseorang harus menggunakan dict literals ({}
) danenumerate
bahkan kemudian.@Veedrac
jika Anda ingin memastikan saya diberi tahu, meskipun Stack Overflow tampaknya dapat menebak dari nama penggunanya. (Saya tidak menulis@Maarten
karena penjawab akan diberi tahu secara default.)Dipinjam dari buku masak python ,
Kode templat yang lebih ringkas mungkin terlihat seperti ini:
sumber
Anda biasanya akan menggunakan
next(incsv)
yang memajukan iterator satu baris, jadi Anda melewati tajuk. Yang lainnya (katakanlah Anda ingin melewati 30 baris) adalah:sumber
gunakan csv.DictReader, bukan csv.Reader. Jika parameter nama bidang dihilangkan, nilai di baris pertama file csv akan digunakan sebagai nama bidang. Anda kemudian dapat mengakses nilai bidang menggunakan baris ["1"] dll
sumber
Paket 'panda' baru mungkin lebih relevan daripada 'csv'. Kode di bawah ini akan membaca file CSV, secara default mengartikan baris pertama sebagai tajuk kolom dan menemukan nilai minimum di seluruh kolom.
sumber
pd.read_csv('all16.csv').min()
Nah, perpustakaan pembungkus mini saya akan melakukan pekerjaan itu juga.
Sementara itu, jika Anda mengetahui indeks kolom header satu, misalnya "Kolom 1", Anda dapat melakukan ini sebagai gantinya:
sumber
Bagi saya cara termudah untuk pergi adalah dengan menggunakan jangkauan.
sumber
Karena ini terkait dengan sesuatu yang saya lakukan, saya akan share disini.
Bagaimana jika kami tidak yakin jika ada tajuk dan Anda juga tidak ingin mengimpor sniffer dan hal lainnya?
Jika tugas Anda dasar, seperti mencetak atau menambahkan ke daftar atau larik, Anda bisa menggunakan pernyataan if:
sumber
The dokumentasi untuk modul Python 3 CSV memberikan contoh ini:
Ini
Sniffer
akan mencoba mendeteksi secara otomatis banyak hal tentang file CSV. Anda perlu memanggilhas_header()
metodenya secara eksplisit untuk menentukan apakah file tersebut memiliki baris header. Jika ya, lewati baris pertama saat mengulang baris CSV. Anda bisa melakukannya seperti ini:sumber
Saya akan menggunakan tail untuk menghilangkan baris pertama yang tidak diinginkan:
sumber
tambahkan saja [1:]
contoh di bawah ini:
yang berfungsi untuk saya di iPython
sumber
Python 3.X
Menangani UTF8 BOM + HEADER
Cukup frustasi bahwa
csv
modul tidak dapat dengan mudah mendapatkan header, ada juga bug pada UTF-8 BOM (karakter pertama dalam file). Ini berfungsi untuk saya hanya dengan menggunakancsv
modul:sumber
Saya akan mengonversi csvreader ke daftar, lalu memunculkan elemen pertama
sumber
Python 2.x
csvreader.next()
Python 3.x
csvreader.__next__()
sumber