Baca File Excel dengan Python


88

Saya memiliki File Excel

Arm_id      DSPName        DSPCode          HubCode          PinCode    PPTL
1            JaVAS            01              AGR             282001    1,2
2            JaVAS            01              AGR             282002    3,4
3            JaVAS            01              AGR             282003    5,6

Saya ingin menyimpan string dalam formulir Arm_id,DSPCode,Pincode. Format ini dapat dikonfigurasi, yaitu mungkin berubah menjadi DSPCode,Arm_id,Pincode. Saya menyimpannya dalam daftar seperti:

FORMAT = ['Arm_id', 'DSPName', 'Pincode']

Bagaimana cara membaca konten kolom tertentu dengan nama yang diberikan, asalkan FORMATdapat dikonfigurasi?

Inilah yang saya coba. Saat ini saya dapat membaca semua konten di file

from xlrd import open_workbook
wb = open_workbook('sample.xls')
for s in wb.sheets():
    #print 'Sheet:',s.name
    values = []
    for row in range(s.nrows):
        col_value = []
        for col in range(s.ncols):
            value  = (s.cell(row,col).value)
            try : value = str(int(value))
            except : pass
            col_value.append(value)
        values.append(col_value)
print values

Keluaran saya adalah

[[u'Arm_id', u'DSPName', u'DSPCode', u'HubCode', u'PinCode', u'PPTL'], ['1', u'JaVAS', '1', u'AGR', '282001', u'1,2'], ['2', u'JaVAS', '1', u'AGR', '282002', u'3,4'], ['3', u'JaVAS', '1', u'AGR', '282003', u'5,6']]

Kemudian saya berputar-putar values[0]mencoba mencari tahu FORMATkonten di values[0]dan kemudian mendapatkan indeks Arm_id, DSPname and Pincodedi values[0]dan kemudian dari pengulangan berikutnya saya tahu indeks semua FORMATfaktor, sehingga mengetahui nilai mana yang perlu saya dapatkan.

Tapi ini solusi yang buruk.

Bagaimana cara mendapatkan nilai kolom tertentu dengan nama di file excel?


Anda harus menggunakan dict()atau membuat kelas data Anda sendiri.
tamasgal

Seperti bagaimana caranya? bisakah Anda memberikan kode contoh?
PythonEnthusiast

Jawaban:


71

Ini satu pendekatan:

from xlrd import open_workbook

class Arm(object):
    def __init__(self, id, dsp_name, dsp_code, hub_code, pin_code, pptl):
        self.id = id
        self.dsp_name = dsp_name
        self.dsp_code = dsp_code
        self.hub_code = hub_code
        self.pin_code = pin_code
        self.pptl = pptl

    def __str__(self):
        return("Arm object:\n"
               "  Arm_id = {0}\n"
               "  DSPName = {1}\n"
               "  DSPCode = {2}\n"
               "  HubCode = {3}\n"
               "  PinCode = {4} \n"
               "  PPTL = {5}"
               .format(self.id, self.dsp_name, self.dsp_code,
                       self.hub_code, self.pin_code, self.pptl))

wb = open_workbook('sample.xls')
for sheet in wb.sheets():
    number_of_rows = sheet.nrows
    number_of_columns = sheet.ncols

    items = []

    rows = []
    for row in range(1, number_of_rows):
        values = []
        for col in range(number_of_columns):
            value  = (sheet.cell(row,col).value)
            try:
                value = str(int(value))
            except ValueError:
                pass
            finally:
                values.append(value)
        item = Arm(*values)
        items.append(item)

for item in items:
    print item
    print("Accessing one single value (eg. DSPName): {0}".format(item.dsp_name))
    print

Anda tidak harus menggunakan kelas khusus, Anda cukup mengambil dict(). Namun, jika Anda menggunakan kelas, Anda dapat mengakses semua nilai melalui notasi titik, seperti yang Anda lihat di atas.

Berikut adalah output dari script diatas:

Arm object:
  Arm_id = 1
  DSPName = JaVAS
  DSPCode = 1
  HubCode = AGR
  PinCode = 282001 
  PPTL = 1
Accessing one single value (eg. DSPName): JaVAS

Arm object:
  Arm_id = 2
  DSPName = JaVAS
  DSPCode = 1
  HubCode = AGR
  PinCode = 282002 
  PPTL = 3
Accessing one single value (eg. DSPName): JaVAS

Arm object:
  Arm_id = 3
  DSPName = JaVAS
  DSPCode = 1
  HubCode = AGR
  PinCode = 282003 
  PPTL = 5
Accessing one single value (eg. DSPName): JaVAS

91

Jawaban yang agak terlambat, tetapi dengan panda, dimungkinkan untuk mendapatkan langsung kolom file excel:

import pandas

df = pandas.read_excel('sample.xls')
#print the column names
print df.columns
#get the values for a given column
values = df['Arm_id'].values
#get a data frame with selected columns
FORMAT = ['Arm_id', 'DSPName', 'Pincode']
df_selected = df[FORMAT]

Pastikan Anda telah menginstal xlrd dan pandas:

pip install pandas xlrd

2
Tambahkan import xlrddi bagian atas agar ini berfungsi. read_excelmembutuhkan xlrd. Jika mendapatkan ImportError: No module named 'xlrd', maka lakukanpip install xlrd
nishant

9
mengimpor xlrd tidak diperlukan, cukup pastikan xlrd sudah diinstal, panda akan mengimpor dan menggunakannya.
Vaibhav Vishal

12

Jadi bagian utamanya adalah mengambil header ( col_names = s.row(0)) dan saat melakukan iterasi melalui baris, untuk melewati baris pertama yang tidak diperlukan for row in range(1, s.nrows)- dilakukan dengan menggunakan rentang dari 1 dan seterusnya (bukan 0 implisit). Anda kemudian menggunakan zip untuk menelusuri baris yang berisi 'nama' sebagai tajuk kolom.

from xlrd import open_workbook

wb = open_workbook('Book2.xls')
values = []
for s in wb.sheets():
    #print 'Sheet:',s.name
    for row in range(1, s.nrows):
        col_names = s.row(0)
        col_value = []
        for name, col in zip(col_names, range(s.ncols)):
            value  = (s.cell(row,col).value)
            try : value = str(int(value))
            except : pass
            col_value.append((name.value, value))
        values.append(col_value)
print values


2

Berikut adalah kode untuk membaca file excel dan dan mencetak semua sel yang ada di kolom 1 (kecuali sel pertama yaitu header):

import xlrd

file_location="C:\pythonprog\xxx.xlsv"
workbook=xlrd.open_workbook(file_location)
sheet=workbook.sheet_by_index(0)
print(sheet.cell_value(0,0))

for row in range(1,sheet.nrows):
     print(sheet.cell_value(row,0))

1

Pendekatan yang saya ambil membaca informasi header dari baris pertama untuk menentukan indeks kolom yang diminati.

Anda menyebutkan dalam pertanyaan bahwa Anda juga ingin nilai-nilai tersebut dikeluarkan untuk sebuah string. Saya secara dinamis membangun string format untuk output dari daftar kolom FORMAT. Baris ditambahkan ke string nilai yang dipisahkan oleh karakter baris baru.

Urutan kolom keluaran ditentukan oleh urutan nama kolom dalam daftar FORMAT.

Dalam kode saya di bawah kasus nama kolom dalam daftar FORMAT adalah penting. Dalam pertanyaan di atas, Anda memiliki 'Kode Pin' di daftar FORMAT Anda, tetapi 'Kode Pin' di excel Anda. Ini tidak akan berfungsi di bawah ini, itu harus 'PinCode'.

from xlrd import open_workbook
wb = open_workbook('sample.xls')

FORMAT = ['Arm_id', 'DSPName', 'PinCode']
values = ""

for s in wb.sheets():
    headerRow = s.row(0)
    columnIndex = [x for y in FORMAT for x in range(len(headerRow)) if y == firstRow[x].value]
    formatString = ("%s,"*len(columnIndex))[0:-1] + "\n"

    for row in range(1,s.nrows):
        currentRow = s.row(row)
        currentRowValues = [currentRow[x].value for x in columnIndex]
        values += formatString % tuple(currentRowValues)

print values

Untuk contoh masukan yang Anda berikan di atas keluaran kode ini:

>>> 1.0,JaVAS,282001.0
2.0,JaVAS,282002.0
3.0,JaVAS,282003.0

Dan karena aku noob python, alat peraga adalah untuk: jawaban ini , jawaban ini , pertanyaan ini , pertanyaan ini dan jawaban ini .


Saya pikir firstRow[x].valueseharusnyaheaderRow[x].value
TSeymour

0

Meskipun saya hampir selalu hanya menggunakan panda untuk ini, alat kecil saya saat ini sedang dikemas menjadi file yang dapat dieksekusi dan menyertakan panda berlebihan. Jadi saya membuat versi solusi poida yang menghasilkan daftar tupel bernama. Kodenya dengan perubahan ini akan terlihat seperti ini:

from xlrd import open_workbook
from collections import namedtuple
from pprint import pprint

wb = open_workbook('sample.xls')

FORMAT = ['Arm_id', 'DSPName', 'PinCode']
OneRow = namedtuple('OneRow', ' '.join(FORMAT))
all_rows = []

for s in wb.sheets():
    headerRow = s.row(0)
    columnIndex = [x for y in FORMAT for x in range(len(headerRow)) if y == headerRow[x].value]

    for row in range(1,s.nrows):
        currentRow = s.row(row)
        currentRowValues = [currentRow[x].value for x in columnIndex]
        all_rows.append(OneRow(*currentRowValues))

pprint(all_rows)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.