前提・実現したいこと
初歩的な質問で大変恐縮なのですが、ご教示をお願い致します。
①Pythonで同フォルダ内にある複数のtextファイルを読込み
②一つのtextファイルに結合
③②について、textファイルとして出力をしたいです。
フォルダ名称:Pass
ファイル名:aaa_200701.txt、aaa_200702.txt … aaa_200712.txt
ただしそれぞれに同一のヘッダーがあります。
単純に結合する事は出来たのですが、2ファイル目以降を読み込む際、ヘッダーは読まないようにしたいです。
・aaa_200701.txtのデータ型
日付 商品 担当者 点数 金額
200701 a1 b1 c1 10 10000
・aaa_200702.txtのデータ型
日付 商品 担当者 点数 金額
200702 a1 b1 c1 8 8000
・
・
・
・【ALL】aaa.txt(※最終的に作りたいデータ)
日付 商品 担当者 点数 金額
200701 a1 b1 c1 10 10000
200702 a1 b1 c1 8 8000
・
・
・
この場合、どのようなコードを使用すれば良いでしょうか?
試したこと
■使用したコード
①②について
import glob, codecs
for file in glob.glob("Pass/aaa*.txt"):
file_data = open(file, "r",encoding="utf-8")
print(file_data.read())
file_data.close
→ただし2ファイル目以降のヘッダーも読んでしまうのでNG
③について
file=codecs.open(Pass/【ALL】aaa.txt', 'w'))
解決に向けた仮説
(A案)
・aaa_200701.txtは全て読む
・aaa_200702.txt~2行目以降を読む
・上記を【ALL】aaa.txt'として結合?
(B案)
・aaa_200701.txtの1行目のみ読む
・aaa_200701.txt~2行目以降を読む
・上記を【ALL】aaa.txt'として結合?
(C案)
・aaa_200701.txt~をaaa_200701.CSVに変換して読込?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答5件
0
ベストアンサー
B案のほうが良いと思います。
- 余計な分岐が無いので処理が簡潔
- ヘッダー行だけに何らかの操作を加えるような拡張に対して柔軟
例えば、こんなふうに。
Python
1with open('out.txt', mode='w') as fout: 2 files = glob.glob('aaa*.txt') 3 assert files 4 5 # ヘッダーの出力 6 with open(files[0]) as fin: 7 header = next(fin) 8 fout.write(header) 9 10 # データ行の出力 11 for file in files: 12 with open(file) as fin: 13 next(fin) # ヘッダーのスキップ 14 fout.writelines(fin)
ヘッダーだけheader.txtから読んでくるとか、
ハードコーディングするとか、そのような変更をしたい場面も多々あるでしょう。
そのようなときもヘッダー行の書き込み処理だけをいじれば良いので簡単です。
本筋から逸れますが、
txtファイルではなくcsvファイルとして扱ったほうが後々扱いやすいかもしれません。
...よく見たら、C案がこれに相当するのですね。
ぶっちゃけ拡張子は半分ただの飾りなので、.txtのままCSV扱いもできます。
試したいことがあるなら気軽にトライできますよ。
もうちょっと複雑な処理が必要になるようであれば、テキストのまま扱うと面倒になってきます。
追記:私の頭の中にあるコード
Python
1with open('out.txt', mode='w') as fout: 2 files = glob.glob('aaa*.txt') 3 assert files 4 5 # ヘッダーの出力 6 header = ['日付', '商品CD', '担当CD', '点数', '金額'] 7 hdr2 = ','.join(header) 8 fout.write(hdr2) 9 10 # データ行の出力 11 for file in files: 12 with open(file) as fin: 13 next(fin) # ヘッダーのスキップ 14 fout.writelines(fin)
投稿2020/07/11 02:19
編集2020/07/18 23:56総合スコア35668
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/11 15:19
2020/07/11 16:03 編集
2020/07/11 16:40
2020/07/11 16:44
2020/07/12 04:13
2020/07/13 02:04
2020/07/13 08:21
2020/07/14 08:04
2020/07/14 10:42
2020/07/14 10:43
2020/07/15 09:05
2020/07/15 10:41
2020/07/15 15:12
2020/07/17 12:48
2020/07/18 14:33
2020/07/18 23:57
2020/07/19 16:22 編集
2020/07/19 16:23
0
たんに最初の1行を読み飛ばせばいいだけでは。
難しく考える必要はないと思いますが
投稿2020/07/10 22:32
総合スコア88042
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
p.py
python3
1import glob 2 3def read_file(file_name): 4 with open(file_name) as f: 5 lines = f.read().splitlines() 6 return [lines[0], lines[1::]] 7 8out_file = "all.txt" 9in_files = "20*.txt" 10out_head = None 11with open(out_file, "w") as f: 12 for file in sorted(glob.glob(in_files)): 13 head, rows = read_file(file) 14 if out_head == None: 15 out_head = head 16 f.write(head + "\n") 17 if len(rows) > 0: 18 f.write("\n".join(rows) + "\n")
参考情報:
- [Python]ディレクトリ内にある複数のファイルをソートして読み込む
https://qiita.com/3000manJPY/items/6100452792e16d0ae921
- python でファイルを read してリストにする時に、改行コードを入れない
投稿2020/07/11 00:17
総合スコア22324
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/11 15:26
2020/07/11 15:45
2020/07/11 16:00 編集
2020/07/13 10:04 編集
2020/07/13 02:32
2020/07/13 10:10
0
この問題を解くだけであれば、どの案でも構いません
難易度も大して変わりません
単一の課題であれば、どれか興味のある方法で問いてみましょう
単一の課題でなく、今後コードを拡張して別の問題を解いたり、何かにコードを利用するのであれば、
出題者に
「今後の拡張や利用も考えると、どの案が良いですか?」
と訊いてから進めた方が、無駄がなくてよいかもしれません
投稿2020/07/10 17:31
総合スコア3272
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/11 15:31
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。