回答編集履歴

1

別の手法も追加

2021/01/09 07:08

投稿

ppaul
ppaul

スコア24666

test CHANGED
@@ -3,6 +3,8 @@
3
3
 
4
4
 
5
5
  ```python
6
+
7
+ import os
6
8
 
7
9
  with zipfile.ZipFile('./archive.zip', 'w') as myZip:
8
10
 
@@ -27,3 +29,49 @@
27
29
  ```
28
30
 
29
31
  ループを1回目だけ実行して、すぐに抜けるという変則的なコードです。
32
+
33
+ 上記のコードは三番目に考えたコードで、その前のコードは以下です。
34
+
35
+ ```python
36
+
37
+ import os
38
+
39
+ with zipfile.ZipFile('archive.zip', 'w') as myZip:
40
+
41
+ for file in os.walk('./').__next__()[2]:
42
+
43
+ if file != 'archive.zip':
44
+
45
+ myZip.write(file)
46
+
47
+ os.remove(file)
48
+
49
+ ```
50
+
51
+ os.walk('./')はジェネレータですので、それを__next__()で呼び出すと長さが3のリストが帰ってきます。その最後の要素には、現在のディレクトリにあるサブディレクトリではないファイルが格納されています。ただ、ジェネレータの__next__メソッドを使うのは一般的ではないので上記のコードにしました。
52
+
53
+
54
+
55
+ 一番最初に思いついたコード下のコードです。これははotnさんも書かれていた方法です。
56
+
57
+ ```python
58
+
59
+ import os
60
+
61
+ import glob
62
+
63
+ with zipfile.ZipFile('archive.zip', 'w') as myZip:
64
+
65
+ for file in glob.glob("*"):
66
+
67
+ if os.path.isfile(file) and file != 'archive.zip':
68
+
69
+ myZip.write(file)
70
+
71
+ os.remove(file)
72
+
73
+ ```
74
+
75
+ しかし、質問のタイトルに、「os.walk()で」とあったので、os.walkを使う答えを考えました。
76
+
77
+ Aki1000さんはいろいろな方法を知りたいというタイプのようですので、いろいろなやり方を書いておきました。行数が一番短いのは二番目の方法ですが、普通こういうのはやらないでしょう。