私はthis codeを使用しました。これは動作しています。今すぐ小さい方の 'rep_list'を実行すると、リスト内の最初のRepがCPに追加されますが、AMに行くとCPが上書きされます。だから私はこのコードを実行すると実際には最後の人がループに保存されます。私がちょうど "CP"でコードを実行し、次に "AM"であれば、それはそれを追加する必要があります。 forループで何か問題がありますか?それともブック自体に問題がありますか?pandas dfをxlsxに書き込むときに、このループを正しく動作させるにはどうすればよいですか?
import pandas as pd
import datetime
from openpyxl import load_workbook
now = datetime.datetime.now()
currentDate = now.strftime("%Y-%m-%d")
call_report = pd.read_excel("Ending 2016-07-30.xlsx", "raw_data")
#rep_list = ["CP", "AM", "JB", "TT", "KE"]
rep_list = ["CP", "AM"]
def call_log_reader(rep_name):
rep_log = currentDate + "-" + rep_name + ".csv"
df = pd.read_csv(rep_log)
df = df.drop(['From Name', 'From Number', 'To Name/Reference', 'To Number', 'Billing Code', 'Original Dialed Number',
'First Hunt Group', 'Last Hunt Group'], axis=1)
df['rep'] = rep_name
book = load_workbook('Ending 2016-07-30.xlsx')
writer = pd.ExcelWriter('Ending 2016-07-30.xlsx', engine='openpyxl')
writer.book = book
writer.sheets = dict((ws.title, ws) for ws in book.worksheets)
df.to_excel(writer, "raw_data", index=False)
writer.save()
## I tried adding this : writer.close() hoping it would close the book and then force it to reopen for the next rep in the loop but it doesn't seem to work.
for rep in rep_list:
call_log_reader(rep)
ありがとうございました!
EDIT:
のGaurav Dhamaは、優れた仕事を偉大な答えを与えました。彼はパンダの執筆者(refer to this link)には少し制限があり、それぞれの担当者が最後に自分のシートを取得するという解決策を提案しました。これはうまくいきましたが、私はそれを考えた後、追加のシートを選び、制限が存在することを知ってこの解決策を思いつきました。基本的には、実際のXLSXファイルの代わりにCSVを追加し、最後にCSVを開いて大きなリストをXLSXファイルに追加しました。どちらの作品でも、最終製品がどのように見えるかによって異なります。
import pandas as pd
import datetime
from openpyxl import load_workbook
now = datetime.datetime.now()
currentDate = now.strftime("%Y-%m-%d")
call_report = "Ending 2016-07-30.xlsx"
#rep_list = ["CP", "AM", "JB", "TT", "KE"]
rep_list = ["CP", "AM"]
csv_to_xl_files = []
merged_csv = currentDate + "-master.csv"
def call_log_reader(rep_name):
rep_log = currentDate + "-" + rep_name + ".csv"
df = pd.read_csv(rep_log)
df = df.drop(['TimestampDetail', 'Billing Code', 'From Name', 'From Number', 'To Name/Reference', 'To Number',
'Original Dialed Number', 'First Hunt Group', 'Last Hunt Group'], axis=1)
df['rep'] = rep_name
#print (df.head(3))
df.to_csv(merged_csv, mode='a', index=False, header=False)
csv_to_xl_files.append(rep_log)
book = load_workbook(call_report)
writer = pd.ExcelWriter(call_report, engine='openpyxl')
writer.book = book
writer.sheets = dict((ws.title, ws) for ws in book.worksheets)
for rep in rep_list:
call_log_reader(rep)
master_df = pd.read_csv(merged_csv)
master_df.to_excel(writer, "raw_data", index=False)
writer.save()
#this csv_to_xl_files list isn't finished yet, basically I'm going to use it to delete the files from the directory as I don't need them once the script is run.
print (csv_to_xl_files)
"For"ループを呼び出す前に上記のコードブロックを置くと、エラーなしで実行されますが、ファイルには "raw_data"という空白のシートしかありません。関数の呼び出し後にforループの後にコードブロックを置くか、forループにNameErrorをスローします:グローバル名 'writer'は定義されていないため、完了しません。 – Mxracer888
私は自分の答えを編集し、コード。これはあなたのために働くはずです。あなたが変数call_reportを読んでいる "Ending 2016-07-30.xlsx"のサンプルを投稿してください。 –
ああ、pandas excelwriterに問題があります。同じシートに別のデータフレームを書くことはできません、それらは次々と上書きし続けます。この[リンク](https://github.com/pydata/pandas/issues/3441)を参照してください。複数のワークシートを生成するためにコードを再度編集しました。 –