প্যান্ডাস ব্যবহার করে কীভাবে বিদ্যমান এক্সেল ফাইলে একটি নতুন শীট সংরক্ষণ করবেন?


90

পাইথনের সাহায্যে বিশদযুক্ত ডেটা সঞ্চয় করতে আমি এক্সেল ফাইলগুলি ব্যবহার করতে চাই। আমার সমস্যাটি হ'ল আমি বিদ্যমান এক্সেল ফাইলটিতে শীট যুক্ত করতে পারছি না। এই সমস্যাটিতে পৌঁছানোর জন্য আমি এখানে কাজ করার জন্য একটি নমুনা কোডের পরামর্শ দিচ্ছি

import pandas as pd
import numpy as np

path = r"C:\Users\fedel\Desktop\excelData\PhD_data.xlsx"

x1 = np.random.randn(100, 2)
df1 = pd.DataFrame(x1)

x2 = np.random.randn(100, 2)
df2 = pd.DataFrame(x2)

writer = pd.ExcelWriter(path, engine = 'xlsxwriter')
df1.to_excel(writer, sheet_name = 'x1')
df2.to_excel(writer, sheet_name = 'x2')
writer.save()
writer.close()

এই কোডটি দুটি শিটের জন্য দুটি ডাটাফ্রেমকে যথাক্রমে "x1" এবং "x2" নামে সংরক্ষণ করে। আমি যদি দুটি নতুন ডেটাফ্রেম তৈরি করি এবং দুটি নতুন শিট, 'x3' এবং 'x4' যুক্ত করতে একই কোডটি ব্যবহার করার চেষ্টা করি, তবে আসল ডেটাটি নষ্ট হয়ে যায়।

import pandas as pd
import numpy as np

path = r"C:\Users\fedel\Desktop\excelData\PhD_data.xlsx"

x3 = np.random.randn(100, 2)
df3 = pd.DataFrame(x3)

x4 = np.random.randn(100, 2)
df4 = pd.DataFrame(x4)

writer = pd.ExcelWriter(path, engine = 'xlsxwriter')
df3.to_excel(writer, sheet_name = 'x3')
df4.to_excel(writer, sheet_name = 'x4')
writer.save()
writer.close()

আমি চারটি শীট সহ একটি এক্সেল ফাইল চাই: 'x1', 'x2', 'x3', 'x4'। আমি জানি যে 'xlsxwriter' কেবলমাত্র "ইঞ্জিন" নয়, সেখানে 'ওপেনপেক্সেক্সল' রয়েছে। আমি আরও দেখেছি ইতিমধ্যে অন্যান্য ব্যক্তিরাও এই সমস্যাটি নিয়ে লিখেছেন তবে এখনও কীভাবে এটি করব তা আমি বুঝতে পারি না।

এই লিঙ্কটি থেকে এখানে নেওয়া একটি কোড

import pandas
from openpyxl import load_workbook

book = load_workbook('Masterfile.xlsx')
writer = pandas.ExcelWriter('Masterfile.xlsx', engine='openpyxl') 
writer.book = book
writer.sheets = dict((ws.title, ws) for ws in book.worksheets)

data_filtered.to_excel(writer, "Main", cols=['Diff1', 'Diff2'])

writer.save()

তারা বলে যে এটি কাজ করে, তবে কীভাবে তা নির্ধারণ করা শক্ত। "Ws.title", "ws", এবং "ڈک" এই প্রসঙ্গে কী তা আমি বুঝতে পারি না।

"X1" এবং "x2" সংরক্ষণ করার সর্বোত্তম উপায় কোনটি, তারপরে ফাইলটি বন্ধ করুন, আবার এটি খুলুন এবং "x3" এবং "x4" যুক্ত করবেন?

উত্তর:


121

ধন্যবাদ. আমি বিশ্বাস করি যে একই সমস্যা আছে এমন যে কোনও ব্যক্তির জন্য একটি সম্পূর্ণ উদাহরণ ভাল হতে পারে:

import pandas as pd
import numpy as np

path = r"C:\Users\fedel\Desktop\excelData\PhD_data.xlsx"

x1 = np.random.randn(100, 2)
df1 = pd.DataFrame(x1)

x2 = np.random.randn(100, 2)
df2 = pd.DataFrame(x2)

writer = pd.ExcelWriter(path, engine = 'xlsxwriter')
df1.to_excel(writer, sheet_name = 'x1')
df2.to_excel(writer, sheet_name = 'x2')
writer.save()
writer.close()

এখানে আমি একটি এক্সেল ফাইল উত্পন্ন করি, আমার বোধগম্যতার দ্বারা এটি "xslxwriter" বা "ওপেনপেক্সএল" ইঞ্জিনের মাধ্যমে উত্পন্ন হয়েছে কিনা তা আসলেই কিছু যায় আসে না।

আমি যখন তখন মূল তথ্যটি না হারিয়ে লিখতে চাই

import pandas as pd
import numpy as np
from openpyxl import load_workbook

path = r"C:\Users\fedel\Desktop\excelData\PhD_data.xlsx"

book = load_workbook(path)
writer = pd.ExcelWriter(path, engine = 'openpyxl')
writer.book = book

x3 = np.random.randn(100, 2)
df3 = pd.DataFrame(x3)

x4 = np.random.randn(100, 2)
df4 = pd.DataFrame(x4)

df3.to_excel(writer, sheet_name = 'x3')
df4.to_excel(writer, sheet_name = 'x4')
writer.save()
writer.close()

এই কোডটি কাজ করে!


কোনও ধারণা, কেন আমি যখন এটি চেষ্টা করি তখন আমি পাই: ভ্যালুআরর: কোনও এক্সেল লেখক 'বিক্রয় লিড ক্যালকুলেশনস এক্সএক্সএলএক্স' না?
bernando_vialli

4
হ্যাঁ, এটি পূর্বের বিদ্যমান শীটগুলি মুছা ছাড়াই এক্সলে শিটটি যুক্ত করছে। ধন্যবাদ!
নিখিল ভিজে

4
এক্সেল ফাইলটি সংরক্ষণ করার সময়, আমি কীভাবে বিদ্যমান এক্সেল শীট ফর্ম্যাটগুলি রাখব?
ভিনিশ টিপি

4
যদি কেউ এটি পড়ে এবং আশ্চর্য হয়ে যায় কীভাবে কোনও নতুন নাম পরিবর্তনের পরিবর্তে একটি বিদ্যমান শীটটিকে একই নামের সাথে কীভাবে ওভাররাইট করা যায়: লাইনটি writer.sheets = dict((ws.title, ws) for ws in book.worksheets) পরে যুক্ত করুন writer.book = book
Harm te Molder

4
@ স্টেফানো ফেডেল আপনি কি 'ওপেনপিএক্সএল' এর পরিবর্তে 'এক্সএলএসএক্সরাইটার' ব্যবহার করে বিদ্যমান এক্সেলের একই আপডেট করতে পারবেন?
এম নিকেশ

15

উদাহরণে আপনি আপনি মধ্যে বিদ্যমান ফাইল লোড করা হচ্ছে ভাগ bookএবং সেটিং writer.bookহতে মান book। লাইনে writer.sheets = dict((ws.title, ws) for ws in book.worksheets)আপনি ওয়ার্কবুকের প্রতিটি শীট অ্যাক্সেস করছেন ws। শীটের শিরোনামটি wsতাই আপনি {sheet_titles: sheet}কী, মান জোড়ার একটি অভিধান তৈরি করছেন । এই অভিধানটি তখন Writer.sheets এ সেট করা আছে। মূলত এই পদক্ষেপগুলি কেবলমাত্র বিদ্যমান ডেটা লোড করে 'Masterfile.xlsx'এবং তাদের সাথে আপনার লেখককে পপুল করছে।

এখন ধরা যাক আপনার কাছে শীট x1এবং এর সাথে ইতিমধ্যে একটি ফাইল রয়েছে x2। আপনার কাছে সেই ফাইলে লোড করতে উদাহরণস্বরূপ কোড ব্যবহার এবং তারপর যোগ করার জন্য এই ভালো কিছু করতে পারে পারেন x3এবং x4

path = r"C:\Users\fedel\Desktop\excelData\PhD_data.xlsx"
writer = pd.ExcelWriter(path, engine='openpyxl')
df3.to_excel(writer, 'x3', index=False)
df4.to_excel(writer, 'x4', index=False)
writer.save()

এটি আপনি যা খুঁজছেন তা করা উচিত।


কোনও ধারণা, কেন আমি যখন এটি চেষ্টা করি তখন আমি পাই: ভ্যালুআরর: কোনও এক্সেল লেখক 'বিক্রয় লিড ক্যালকুলেশনস এক্সএক্সএলএক্স' না?
bernando_vialli

18
এটি পূর্ব বিদ্যমান শিটগুলি মুছে ফেলছে।
নিখিল ভিজে

13

একবারে এক্সেল করার জন্য একাধিক ডেটা লেখার একটি সাধারণ উদাহরণ। এছাড়াও যখন আপনি কোনও লিখিত এক্সেল ফাইলের একটি শীটে ডেটা যুক্ত করতে চান (ক্লোজড এক্সেল ফাইল)।

এটি যখন আপনার প্রথমবারের মতো কোনও এক্সেলে লেখা হয়। ("ডিএফ 1" এবং "ডিএফ 2" "1 ম_শীট" এবং "2 য়_পত্রক" তে লেখা)

import pandas as pd 
from openpyxl import load_workbook

df1 = pd.DataFrame([[1],[1]], columns=['a'])
df2 = pd.DataFrame([[2],[2]], columns=['b'])
df3 = pd.DataFrame([[3],[3]], columns=['c'])

excel_dir = "my/excel/dir"

with pd.ExcelWriter(excel_dir, engine='xlsxwriter') as writer:    
    df1.to_excel(writer, '1st_sheet')   
    df2.to_excel(writer, '2nd_sheet')   
    writer.save()    

আপনি আপনার এক্সেলটি বন্ধ করার পরে, আপনি একই এক্সেল ফাইলের সাথে অন্য একটি শিটের ডেটা "যুক্ত" করতে চান, তবে শীটটির নাম "তৃতীয়_শীট" "df3" বলুন।

book = load_workbook(excel_dir)
with pd.ExcelWriter(excel_dir, engine='openpyxl') as writer:
    writer.book = book
    writer.sheets = dict((ws.title, ws) for ws in book.worksheets)    

    ## Your dataframe to append. 
    df3.to_excel(writer, '3rd_sheet')  

    writer.save()     

লক্ষ করুন যে এক্সেল ফর্ম্যাটটি অবশ্যই xls হওয়া উচিত নয়, আপনি এক্সএলএক্সএক্স ব্যবহার করতে পারেন।


4
এই উত্তরটি কী যুক্ত করে তা আমি দেখছি না। প্রকৃতপক্ষে, এই জাতীয় প্রাসঙ্গিক ব্যবস্থাপকের বারবার ব্যবহারে অনেক বেশি I / O জড়িত।
চার্লি ক্লার্ক

8

আমি আপনাকে দৃ open়ভাবে সুপারিশ করব ওপেনপেক্সএলসিসহ সরাসরি কাজ করার কারণ এটি এখন পান্ডাস ডেটা ফ্রেম সমর্থন করে

এটি আপনাকে প্রাসঙ্গিক এক্সেল এবং পান্ডাস কোডটিতে মনোনিবেশ করতে দেয়।


4
যদি আপনি বিট আরো "পান্ডাস" অনুরূপ উদাহরণ যোগ করতে পারিনি এটা সত্যিই সহায়ক হবে এই
MaxU

আমি নিজে পান্ডাদের সাথে প্রচুর কাজ করি না তাই আমি সত্যিই এতগুলি উদাহরণ সরবরাহ করতে পারি না তবে ডকুমেন্টেশনের উন্নতির স্বাগত জানাতে পারি।
চার্লি ক্লার্ক

4

একটি নতুন ফাইল তৈরি করার জন্য

x1 = np.random.randn(100, 2)
df1 = pd.DataFrame(x1)
with pd.ExcelWriter('sample.xlsx') as writer:  
    df1.to_excel(writer, sheet_name='x1')

ফাইলে সংযোজন জন্য, যুক্তি ব্যবহার mode='a'মধ্যে pd.ExcelWriter

x2 = np.random.randn(100, 2)
df2 = pd.DataFrame(x2)
with pd.ExcelWriter('sample.xlsx', engine='openpyxl', mode='a') as writer:  
    df2.to_excel(writer, sheet_name='x2')

ডিফল্ট হয় mode ='w'ডকুমেন্টেশন দেখুন ।


3

এক্সপ্রেইটার ব্যবহার না করে এটি ওপেনপিএক্সএল-এ সরঞ্জাম ব্যবহার না করে এটি নতুন শীটে ফন্ট যুক্ত করা আরও সহজ করে তুলতে পারে openpyxl.styles

import pandas as pd
from openpyxl import load_workbook
from openpyxl.utils.dataframe import dataframe_to_rows

#Location of original excel sheet
fileLocation =r'C:\workspace\data.xlsx'

#Location of new file which can be the same as original file
writeLocation=r'C:\workspace\dataNew.xlsx'

data = {'Name':['Tom','Paul','Jeremy'],'Age':[32,43,34],'Salary':[20000,34000,32000]}

#The dataframe you want to add
df = pd.DataFrame(data)

#Load existing sheet as it is
book = load_workbook(fileLocation)
#create a new sheet
sheet = book.create_sheet("Sheet Name")

#Load dataframe into new sheet
for row in dataframe_to_rows(df, index=False, header=True):
    sheet.append(row)

#Save the modified excel at desired location    
book.save(writeLocation)

এটি একটি দুর্দান্ত সমাধান, তবে আমি নিশ্চিত নই যে এটির সাথেও কোনও প্রভাব রয়েছে কিনা। আপনি কি বোঝাতে চাইছেন যে আপনি এটি দিয়ে করতে পারবেন না ExcelWriterবা আপনার কেবল প্রয়োজন নেই?
ম্যাটসোম

আপনি এটি এক্সেলরাইটারের সাহায্যে করতে পারেন, তবে আমি কেবল ওপেনপিএক্সএল ব্যবহার করে এটিকে আরও সহজ মনে করি।
জিস ম্যাথিউ

2

আপনি আপনার আগ্রহের বিদ্যমান পত্রকগুলি পড়তে পারেন, উদাহরণস্বরূপ, 'x1', 'x2', মেমরির মধ্যে এবং আরও নতুন শীট যুক্ত করার আগে সেগুলি আবার 'লিখুন' (মনে রাখবেন যে কোনও ফাইলের শিটগুলি এবং মেমরিতে শীটগুলি দুটি আলাদা) জিনিসগুলি, আপনি যদি সেগুলি না পড়েন তবে সেগুলি নষ্ট হয়ে যাবে)। এই পদ্ধতির কেবল 'xlsxwriter' ব্যবহার করা হয়, কোনও ওপেনপেক্সএল যুক্ত নেই।

import pandas as pd
import numpy as np

path = r"C:\Users\fedel\Desktop\excelData\PhD_data.xlsx"

# begin <== read selected sheets and write them back
df1 = pd.read_excel(path, sheet_name='x1', index_col=0) # or sheet_name=0
df2 = pd.read_excel(path, sheet_name='x2', index_col=0) # or sheet_name=1
writer = pd.ExcelWriter(path, engine='xlsxwriter')
df1.to_excel(writer, sheet_name='x1')
df2.to_excel(writer, sheet_name='x2')
# end ==>

# now create more new sheets
x3 = np.random.randn(100, 2)
df3 = pd.DataFrame(x3)

x4 = np.random.randn(100, 2)
df4 = pd.DataFrame(x4)

df3.to_excel(writer, sheet_name='x3')
df4.to_excel(writer, sheet_name='x4')
writer.save()
writer.close()

আপনি যদি সমস্ত বিদ্যমান শীট সংরক্ষণ করতে চান তবে উপরের কোডটি শুরু এবং শেষের মধ্যে প্রতিস্থাপন করতে পারেন:

# read all existing sheets and write them back
writer = pd.ExcelWriter(path, engine='xlsxwriter')
xlsx = pd.ExcelFile(path)
for sheet in xlsx.sheet_names:
    df = xlsx.parse(sheet_name=sheet, index_col=0)
    df.to_excel(writer, sheet_name=sheet)

1
#This program is to read from excel workbook to fetch only the URL domain names and write to the existing excel workbook in a different sheet..
#Developer - Nilesh K
import pandas as pd
from openpyxl import load_workbook #for writting to the existing workbook

df = pd.read_excel("urlsearch_test.xlsx")

#You can use the below for the relative path.
# r"C:\Users\xyz\Desktop\Python\

l = [] #To make a list in for loop

#begin
#loop starts here for fetching http from a string and iterate thru the entire sheet. You can have your own logic here.
for index, row in df.iterrows():
    try: 
        str = (row['TEXT']) #string to read and iterate
        y = (index)
        str_pos = str.index('http') #fetched the index position for http
        str_pos1 = str.index('/', str.index('/')+2) #fetched the second 3rd position of / starting from http
        str_op = str[str_pos:str_pos1] #Substring the domain name
        l.append(str_op) #append the list with domain names

    #Error handling to skip the error rows and continue.
    except ValueError:
            print('Error!')
print(l)
l = list(dict.fromkeys(l)) #Keep distinct values, you can comment this line to get all the values
df1 = pd.DataFrame(l,columns=['URL']) #Create dataframe using the list
#end

#Write using openpyxl so it can be written to same workbook
book = load_workbook('urlsearch_test.xlsx')
writer = pd.ExcelWriter('urlsearch_test.xlsx',engine = 'openpyxl')
writer.book = book
df1.to_excel(writer,sheet_name = 'Sheet3')
writer.save()
writer.close()

#The below can be used to write to a different workbook without using openpyxl
#df1.to_excel(r"C:\Users\xyz\Desktop\Python\urlsearch1_test.xlsx",index='false',sheet_name='sheet1')

4
এটি কীভাবে প্রশ্নের সাথে সম্পর্কিত তা অনুসরণ করছি না, কেবল এক্সেল সম্পর্কে।
আর্টোগ

আমি বিদ্যমান ওয়ার্কবুকটি পড়তে এবং লেখার একটি সম্পূর্ণ সমাধান সন্ধানের জন্য কাজ করছি তবে এটি সন্ধান করতে অক্ষম was এখানে আমি বিদ্যমান ওয়ার্কবুকটিতে কীভাবে লিখব তার একটি ইঙ্গিতটি পেয়েছি যাতে আমি আমার সমস্যার সম্পূর্ণ সমাধান দেওয়ার কথা ভেবেছিলাম। আশা করি এটি পরিষ্কার হয়ে যাবে।
নিলেশক 611

0

এ সম্পর্কে আরও একটি মোটামুটি সহজ উপায় হ'ল এই পদ্ধতিটি তৈরি করা:

def _write_frame_to_new_sheet(path_to_file=None, sheet_name='sheet', data_frame=None):
    book = None
    try:
        book = load_workbook(path_to_file)
    except Exception:
        logging.debug('Creating new workbook at %s', path_to_file)
    with pd.ExcelWriter(path_to_file, engine='openpyxl') as writer:
        if book is not None:
            writer.book = book
        data_frame.to_excel(writer, sheet_name, index=False)

ধারণা এখানে ওয়ার্কবুক লোড হয় path_to_file যদি উপস্থিত থাকে এবং তারপর যোগ data_frame সঙ্গে একটি নতুন শীট হিসাবে SHEET_NAME । ওয়ার্কবুকটি না থাকলে এটি তৈরি করা হয়। দেখে মনে হচ্ছে যে ওপেনপিএক্সএল বা এক্সএলএসএক্সরাইটার সংযোজন নয়, সুতরাং উপরের @ স্টেফানো দ্বারা উদাহরণস্বরূপ, আপনাকে সত্যিই লোড করতে হবে এবং তারপরে যুক্ত করতে পুনরায় লিখতে হবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.