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

回答編集履歴

8

追記

2018/08/03 20:51

投稿

umyu
umyu

スコア5846

answer CHANGED
@@ -33,7 +33,8 @@
33
33
  ~~Pythonのバージョンが分かりませんでしたので、バージョンに限定されない書き方にします。~~
34
34
  失礼しました、質問文にバージョン2.7と書いてありました。
35
35
  **モジュールの事はまず忘れてください。**まず一連のファイル名を取得する関数を作ります。
36
- 拡張子を指定してファイル一覧を取得にはos.globが使えます。
36
+ 拡張子を指定してファイル一覧を取得には[glob.glob](https://docs.python.org/ja/2.7/library/glob.html)が使えます。
37
+ ◇参考情報
37
38
  [Pythonでフォルダ内のファイルリストを取得する](https://qiita.com/amowwee/items/e63b3610ea750f7dba1b)
38
39
  ```Python
39
40
  import glob

7

Python 2.7 環境なので、変更。

2018/08/03 20:51

投稿

umyu
umyu

スコア5846

answer CHANGED
@@ -30,7 +30,8 @@
30
30
 
31
31
  ---
32
32
 
33
- Pythonのバージョンが分かりませんでしたので、バージョンに限定されない書き方にします。
33
+ ~~Pythonのバージョンが分かりませんでしたので、バージョンに限定されない書き方にします。~~
34
+ 失礼しました、質問文にバージョン2.7と書いてありました。
34
35
  **モジュールの事はまず忘れてください。**まず一連のファイル名を取得する関数を作ります。
35
36
  拡張子を指定してファイル一覧を取得にはos.globが使えます。
36
37
  [Pythonでフォルダ内のファイルリストを取得する](https://qiita.com/amowwee/items/e63b3610ea750f7dba1b)
@@ -43,12 +44,14 @@
43
44
  :params path 検索フォルダ
44
45
  :params ext 拡張子
45
46
  """
46
- # glob.globの結果はlistなので拡張子以外に除外したいファイルがあれば、
47
- # glob.globの結果をこの関数内でループで回して、除外ファイル以外をyieldとしてくださいな。
48
- return glob.glob(path + "/*" + ext)
47
+ for file_name in sorted(glob.glob(path + "/*" + ext)):
48
+ # 同じ拡張子で除外したいファイルがもしあれば、この位置でif文で判断してください。
49
+ print(file_name)
50
+ # ファイル名を1個ずつyieldで返す。
51
+ yield file_name
49
52
 
50
53
  # 呼び出し方法
51
- print(extract_files("./codes", ".js"))
54
+ print(list(extract_files("./codes", ".js")))
52
55
  ```
53
56
 
54
57
  次にこの関数を使ってforループで回します。
@@ -61,11 +64,8 @@
61
64
 
62
65
  ```
63
66
 
64
- ```Python
65
- # f.writeの部分は"/" * 24が使えるかと
66
- f.write("/" * 24 + '\n//page//' + os.path.basename(file_name) + '\n' + file_data.read() + '\n')
67
- ```
68
- その後、`extract_files`関数を`extract.py`に記述を移し、`javascript_kindle.py`で`extract_files`の呼び出し部分を`extract.extract_files`に変更します。
67
+ その後、上記関数を`extract_files`関数を`extract.py`に記述を移し、`javascript_kindle.py`で`extract_files`の呼び出し部分を`extract.extract_files`に変更します。
68
+ この手順でモジュール化ができます。
69
69
 
70
70
  ---
71
71
  以下はサンプルコードです。
@@ -79,12 +79,15 @@
79
79
  """
80
80
  :params path 検索フォルダ
81
81
  :params ext 拡張子
82
+ :return ファイル名
82
83
  """
83
- return glob.glob(path + "/*" + ext)
84
+ for file_name in glob.iglob(path + "/*" + ext):
85
+ print(file_name)
86
+ yield file_name
84
87
 
85
88
 
86
89
  def main():
87
- print(extract_files("./codes", ".js"))
90
+ print(list(extract_files("./codes", ".js")))
88
91
 
89
92
 
90
93
  if __name__ == "__main__":

6

追記

2018/08/03 20:48

投稿

umyu
umyu

スコア5846

answer CHANGED
@@ -43,6 +43,8 @@
43
43
  :params path 検索フォルダ
44
44
  :params ext 拡張子
45
45
  """
46
+ # glob.globの結果はlistなので拡張子以外に除外したいファイルがあれば、
47
+ # glob.globの結果をこの関数内でループで回して、除外ファイル以外をyieldとしてくださいな。
46
48
  return glob.glob(path + "/*" + ext)
47
49
 
48
50
  # 呼び出し方法

5

サンプルコードを追加

2018/08/03 11:56

投稿

umyu
umyu

スコア5846

answer CHANGED
@@ -63,4 +63,46 @@
63
63
  # f.writeの部分は"/" * 24が使えるかと
64
64
  f.write("/" * 24 + '\n//page//' + os.path.basename(file_name) + '\n' + file_data.read() + '\n')
65
65
  ```
66
- その後、`extract_files`関数を`extract.py`に記述を移し、`javascript_kindle.py`で`extract_files`の呼び出し部分を`extract.extract_files`に変更します。
66
+ その後、`extract_files`関数を`extract.py`に記述を移し、`javascript_kindle.py`で`extract_files`の呼び出し部分を`extract.extract_files`に変更します。
67
+
68
+ ---
69
+ 以下はサンプルコードです。
70
+ extract.py
71
+ ```Python
72
+ # -*- coding: utf-8 -*-
73
+ import glob
74
+
75
+
76
+ def extract_files(path, ext):
77
+ """
78
+ :params path 検索フォルダ
79
+ :params ext 拡張子
80
+ """
81
+ return glob.glob(path + "/*" + ext)
82
+
83
+
84
+ def main():
85
+ print(extract_files("./codes", ".js"))
86
+
87
+
88
+ if __name__ == "__main__":
89
+ main()
90
+ ```
91
+ javascript_kindle.py
92
+ ```Python
93
+ # -*- coding: utf-8 -*-
94
+ import os
95
+ import extract
96
+
97
+
98
+ def main():
99
+ with open('./output.txt', 'w+') as f:
100
+ for file_name in extract.extract_files("./codes", ".js"):
101
+ with open(file_name, 'r') as file_data:
102
+ f.write('/' * 24 + '\n//page//' + os.path.basename(file_name) + '\n' + file_data.read() + '\n')
103
+
104
+
105
+ if __name__ == "__main__":
106
+ main()
107
+
108
+ ```

4

追記

2018/08/03 11:53

投稿

umyu
umyu

スコア5846

answer CHANGED
@@ -26,4 +26,41 @@
26
26
  file_data = open('./codes/page' + str(i) + extract.filelistname[extract.index:], 'r')
27
27
  ```
28
28
  ◇参考情報
29
- [global 文](https://docs.python.jp/3/reference/simple_stmts.html#global)
29
+ [global 文](https://docs.python.jp/3/reference/simple_stmts.html#global)
30
+
31
+ ---
32
+
33
+ Pythonのバージョンが分かりませんでしたので、バージョンに限定されない書き方にします。
34
+ **モジュールの事はまず忘れてください。**まず一連のファイル名を取得する関数を作ります。
35
+ 拡張子を指定してファイル一覧を取得にはos.globが使えます。
36
+ [Pythonでフォルダ内のファイルリストを取得する](https://qiita.com/amowwee/items/e63b3610ea750f7dba1b)
37
+ ```Python
38
+ import glob
39
+ import os
40
+
41
+ def extract_files(path, ext):
42
+ """
43
+ :params path 検索フォルダ
44
+ :params ext 拡張子
45
+ """
46
+ return glob.glob(path + "/*" + ext)
47
+
48
+ # 呼び出し方法
49
+ print(extract_files("./codes", ".js"))
50
+ ```
51
+
52
+ 次にこの関数を使ってforループで回します。
53
+ ```Python
54
+ with open('./output.txt', 'w+') as f:
55
+ for file_name in extract_files("./codes", ".js"):
56
+ print("/" * 24)
57
+ print(file_name)
58
+ print(os.path.basename(file_name))
59
+
60
+ ```
61
+
62
+ ```Python
63
+ # f.writeの部分は"/" * 24が使えるかと
64
+ f.write("/" * 24 + '\n//page//' + os.path.basename(file_name) + '\n' + file_data.read() + '\n')
65
+ ```
66
+ その後、`extract_files`関数を`extract.py`に記述を移し、`javascript_kindle.py`で`extract_files`の呼び出し部分を`extract.extract_files`に変更します。

3

追記

2018/08/03 11:45

投稿

umyu
umyu

スコア5846

answer CHANGED
@@ -4,19 +4,26 @@
4
4
  global filelistname
5
5
  filelistname = filelist[0] # extract_last関数の呼び出しのこの行でグローバル変数が定義される。
6
6
  ```
7
- `javascript_kindle.py`は変数:`filelistname`をモジュールレベルで定義していなく かつ `extract_last`の呼び出しを行っていないため、`global`(モジュールレベル)で変数定義できてないです。
7
+ `extract.py`は変数:`filelistname`をモジュールレベルで定義していなく かつ `javascript_kindle.py`は`extract_last`の呼び出しを行っていないため、`global`(モジュールレベル)で変数定義できてないです。
8
8
 
9
9
  ◇対応案
10
10
  案1,`extract_last`関数を呼び出してから変数を使用する。
11
- 案2,モジュールレベルで変数を定義する
11
+ 案2,モジュールレベルで変数を先に定義しておく
12
- ※スクリプトのやりたいことがよく分かりませんが、`extract_last`関数の`return`で値を返すのはだめなのでしょうか?
13
12
 
13
+ **※スクリプトのやりたいことがよく分かりませんが、`extract_last`関数の`return`で値を返すのはだめなのでしょうか?**
14
+
14
15
  案2の対応です。
16
+ `extract.py`側
15
17
  ```Python
16
18
  filelistname = "" # PEP8に従うのなら、変数名は大文字で。
17
19
  index = 0 #
18
20
  def extract_last():
19
21
  # 以下省略
20
22
  ```
23
+ `javascript_kindle.py`側
24
+ ```Python
25
+ # 変数:indexにモジュール名(extract)が付いていないので追加
26
+ file_data = open('./codes/page' + str(i) + extract.filelistname[extract.index:], 'r')
27
+ ```
21
28
  ◇参考情報
22
29
  [global 文](https://docs.python.jp/3/reference/simple_stmts.html#global)

2

追記

2018/08/02 23:22

投稿

umyu
umyu

スコア5846

answer CHANGED
@@ -8,8 +8,8 @@
8
8
 
9
9
  ◇対応案
10
10
  案1,`extract_last`関数を呼び出してから変数を使用する。
11
- 案2,グロル変数を定義する。
11
+ 案2,モジュールレベルで変数を定義する。
12
- ※スクリプトのやりたいことがよく分かりませんが、関数のreturnで値を返すのはだめなのでしょうか?
12
+ ※スクリプトのやりたいことがよく分かりませんが、`extract_last`関数の`return`で値を返すのはだめなのでしょうか?
13
13
 
14
14
  案2の対応です。
15
15
  ```Python

1

追記

2018/08/02 23:14

投稿

umyu
umyu

スコア5846

answer CHANGED
@@ -1,9 +1,22 @@
1
+ ```Python
1
- 質問文のスクリプトのやりたいことがよく分かりませんが。
2
+ def extract_last():
3
+ filelist = os.listdir("./codes")
2
- global(モジュールレベル)で変数定義できてないです。
4
+ global filelistname
5
+ filelistname = filelist[0] # extract_last関数の呼び出しのこの行でグローバル変数が定義される。
6
+ ```
7
+ `javascript_kindle.py`は変数:`filelistname`をモジュールレベルで定義していなく かつ `extract_last`の呼び出しを行っていないため、`global`(モジュールレベル)で変数定義できてないです。
3
8
 
9
+ ◇対応案
10
+ 案1,`extract_last`関数を呼び出してから変数を使用する。
11
+ 案2,グローバル変数を定義する。
12
+ ※スクリプトのやりたいことがよく分かりませんが、関数のreturnで値を返すのはだめなのでしょうか?
13
+
14
+ 案2の対応です。
4
15
  ```Python
5
- filelistname = ""
16
+ filelistname = "" # PEP8に従うのなら、変数名は大文字で。
6
- index = 0
17
+ index = 0 #
7
18
  def extract_last():
8
19
  # 以下省略
9
- ```
20
+ ```
21
+ ◇参考情報
22
+ [global 文](https://docs.python.jp/3/reference/simple_stmts.html#global)