質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.62%

pythonでフォルダ内に複数あるExcelファイルを読み取って.txtで出力したい。

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 329

colorful_39

score 20

Excelで伝票を作っています。
pythonを使って少しでも楽できなかと悪戦苦闘しております。

今回は、Excelファイル内の「伝票番号」「会社名」を抜き出した一覧を
.txtで作りたいと思います。

目標

フォルダ
ファイルA
ファイルB
ファイルC

.txt
No.001 〇〇会社
No.002 ××会社
No.003 ××会社

できること

・以前にExcelファイルをopenpyxlで扱ったことがあるので
ファイル指定、シート指定、セル指定して値を取得はできます。

import openpyxl

ep = 'C:\\Users\\test\\0000.xlsx'
wb = openpyxl.load_workbook(filename=ep)

sheet2 = wb['1111']

No = sheet2['G47'].value
client = sheet2['C47'].value

・globを使ってフォルダ内のExcelファイルを取得もできます。

import glob

files=glob.glob(r'C:\\Users\\test\\*.xlsx')

for file in files:
ここから先がわかりません。

できないこと

上記の二つを組み合わることがまずできていません。
あと、一覧を取得できたとして.txtにして書き出す
方法がわかりません。

懇願

説明が長くなりました。
もっといい方法もあると思うのですが
どなたかご教示願えませんでしょうか?
よろしくお願いします。

環境

python 3.x  windows10

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

import glob
import openpyxl

#ここでxlsxファイルのパスがリスト化される
files = glob.glob(r'C:\\Users\\test\\*.xlsx')
#print(files)して確認してみてください。
#パスがリスト化され出力れると思います。


#リストからファイルを一つずつ取り出して処理を行う
for file in files:
    #print(file)して確認してみてください。
    #一つずつファイルのパスがprintされると思います。

    #ここに一つずつ取り出したファイルに対しやりたい処理を書いていきます。
    wb = openpyxl.load_workbook(filename=file)
    sheet2 = wb['1111']
    No = sheet2['G47'].value
    client = sheet2['C47'].value

text保存したいという事でしたが、各データを各textファイルに保存したいのか
それとも複数のデータを一つのtextファイルにまとめて保存したいのかがわからない為
正しく導く事が出来ませんが、ファイルへの保存の仕方は下記となります。

    #textへの保存の処理
    f = open('保存したいファイル名', 'w')
    f.writelines(入力したい値)
    f.close()


データを各textファイルに保存したいという事であればfor文の中に
複数のデータを一つのtextファイルにまとめて保存したいということであれば
for文を抜けた後に記述してあげてください。

追記

import openpyxl
import glob


files = glob.glob(r'C:\Users\a\Desktop\test\新しいフォルダー\\*xlsx')
#for文で取り出した値を入れておく為の辞書を用意しておく
client_dict = {}
for file in files:
    wb = openpyxl.load_workbook(file)
    num = wb['1111']['G74'].value
    client = wb['1111']['C74'].value
    client_dict[num] = client

#textファイルをここで操作していく
#textファイルが存在しない場合には自動で生成される。存在している場合にはそのまま追記される
with open('ファイル名.txt', 'w', newline='\n') as f:
    #ループ処理で辞書からkeyとvalueを取り出し文末に改行を入れて追記し保存する処理
    for k,v in client_dict.items():
        f.write('No.{} {}\n'.format(k, v))

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/04/03 20:53

    恐らくそうかと思いました。
    txt保存のやり方も追記しておりますのでお確かめください。

    キャンセル

  • 2020/04/03 21:21

    何から何までありがとうございます。
    追記拝見させて頂きました。

    client_dict[num] = client がエラーになります。
    「client_dict[num] = client
     NameError: name 'client_dict' is not defined」

    txtファイルは出来ます。ファイル名も付きます。
    ですが、開くと真っ白です。すみません。

    キャンセル

  • 2020/04/04 02:26

    少々方法は違いましたが、自己解決できました。
    順番を間違っていました。
    ご返答有難うございました。

    import glob
    import openpyxl

    files=glob.glob(r'C:\\Users\\test\\*.xlsx')
    path_w = 'C:\\Users\\test\\test.txt'

    with open(path_w, 'w') as f:
    for file in files:
    wb = openpyxl.load_workbook(file)
    A = wb['Sheet2']["G47"].value
    B = wb['Sheet2']['C47'].value
    D = wb['Sheet2']['A49'].value
    f.write(f"{A},{B},{C}\n")

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.62%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る