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 FORMAT
dapat 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 FORMAT
konten di values[0]
dan kemudian mendapatkan indeks Arm_id, DSPname and Pincode
di values[0]
dan kemudian dari pengulangan berikutnya saya tahu indeks semua FORMAT
faktor, sehingga mengetahui nilai mana yang perlu saya dapatkan.
Tapi ini solusi yang buruk.
Bagaimana cara mendapatkan nilai kolom tertentu dengan nama di file excel?
dict()
atau membuat kelas data Anda sendiri.Jawaban:
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
sumber
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:
sumber
import xlrd
di bagian atas agar ini berfungsi.read_excel
membutuhkanxlrd
. Jika mendapatkanImportError: No module named 'xlrd'
, maka lakukanpip install xlrd
Jadi bagian utamanya adalah mengambil header (
col_names = s.row(0)
) dan saat melakukan iterasi melalui baris, untuk melewati baris pertama yang tidak diperlukanfor 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
sumber
Dengan menggunakan panda kita bisa membaca excel dengan mudah.
import pandas as pd from pandas import ExcelWriter from pandas import ExcelFile DataF=pd.read_excel("Test.xlsx",sheet_name='Sheet1') print("Column headings:") print(DataF.columns)
Tes di: https://repl.it Referensi: https://pythonspot.com/read-excel-with-pandas/
sumber
xlrd
?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))
sumber
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 .
sumber
firstRow[x].value
seharusnyaheaderRow[x].value
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)
sumber