teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

別の手法も追加

2021/01/09 07:08

投稿

ppaul
ppaul

スコア24672

answer CHANGED
@@ -1,6 +1,7 @@
1
1
  元の形を保ちたいのであれば
2
2
 
3
3
  ```python
4
+ import os
4
5
  with zipfile.ZipFile('./archive.zip', 'w') as myZip:
5
6
  des_folder = './'
6
7
  for folder, subfolders, files in os.walk(des_folder):
@@ -12,4 +13,27 @@
12
13
  break
13
14
 
14
15
  ```
15
- ループを1回目だけ実行して、すぐに抜けるという変則的なコードです。
16
+ ループを1回目だけ実行して、すぐに抜けるという変則的なコードです。
17
+ 上記のコードは三番目に考えたコードで、その前のコードは以下です。
18
+ ```python
19
+ import os
20
+ with zipfile.ZipFile('archive.zip', 'w') as myZip:
21
+ for file in os.walk('./').__next__()[2]:
22
+ if file != 'archive.zip':
23
+ myZip.write(file)
24
+ os.remove(file)
25
+ ```
26
+ os.walk('./')はジェネレータですので、それを__next__()で呼び出すと長さが3のリストが帰ってきます。その最後の要素には、現在のディレクトリにあるサブディレクトリではないファイルが格納されています。ただ、ジェネレータの__next__メソッドを使うのは一般的ではないので上記のコードにしました。
27
+
28
+ 一番最初に思いついたコード下のコードです。これははotnさんも書かれていた方法です。
29
+ ```python
30
+ import os
31
+ import glob
32
+ with zipfile.ZipFile('archive.zip', 'w') as myZip:
33
+ for file in glob.glob("*"):
34
+ if os.path.isfile(file) and file != 'archive.zip':
35
+ myZip.write(file)
36
+ os.remove(file)
37
+ ```
38
+ しかし、質問のタイトルに、「os.walk()で」とあったので、os.walkを使う答えを考えました。
39
+ Aki1000さんはいろいろな方法を知りたいというタイプのようですので、いろいろなやり方を書いておきました。行数が一番短いのは二番目の方法ですが、普通こういうのはやらないでしょう。