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

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

新規登録して質問してみよう
ただいま回答率
85.48%
import

自身のプラットフォーム・プログラム・データセットに対して、外部ソースを取り込むプロセスをimportと呼びます。

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Q&A

解決済

1回答

1380閲覧

[Python] importしたモジュール内の変数が使えない

Yukiya025

総合スコア86

import

自身のプラットフォーム・プログラム・データセットに対して、外部ソースを取り込むプロセスをimportと呼びます。

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

0グッド

0クリップ

投稿2018/08/02 22:14

編集2018/08/04 22:16

実行環境

  • Cloud9
  • Windows7
  • Python 2.7

困っていること

  • 同じ階層にあるextract.pyをjavascript_kindle.pyにimportしても、そのモジュール内の変数 (filelistnameとindex) がなぜか片方 (index) 使えない。
  • importしたモジュール内の変数indexを使う行で Undefined valuable "index"と出る (赤い×印の行)

フォルダ構造
×がついた画面 (javascript_kindle.py)

python:extract.py

1# extract.py 2# -*- coding:utf-8 -*- 3# codesフォルダのファイル名を取得 4# [_]以降のファイル名を取得 5# print() する 6import os 7# ファイルパスも文字列! 8# basename = os.path.basename("./codes") codesとフォルダ名が返ってきた 9 10def extract_last(): 11 filelist = os.listdir("./codes") 12 global filelistname 13 filelistname = filelist[0] 14 # [_]以降のファイル名を取得 15 global index 16 index = filelistname.find('_') 17 print(filelistname) 18 print(str(index)) 19 print(filelistname[index:]) # 2番目から末尾までの文字を取り出す

python:javascript_kindle.py

1# javascript_kindle.py 2# -*- coding:utf-8 -*- 3 4import os 5import extract 6files = os.listdir('./codes') 7filenum = len(files) + 1 8 9with open('./output.txt', 'w+') as f: 10 for i in range(1, filenum): 11 file_data = open('./codes/page' + str(i) + extract.filelistname[index:], 'r') 12 # スラッシュの数は24個 13 # ''と""の使い分け: どちらでもよいが、どちらかに統一 14 f.write('////////////////////////\n//page' + str(i) + extract.filelistname[index:] + '\n' + file_data.read() + '\n')

試したこと (しかしうまくいかない)

よろしくお願いしますm(_)m

できました! ありがとうございます(≧∀≦)

umyu様、ありがとうございますヽ(゚▽゚*)乂(*゚▽゚)ノ

python:extract.py

1# extract.py 2# -*- coding:utf-8 -*- 3 4import glob 5import os 6 7filelistname = "" 8index = 0 9def extract_files(path, ext): 10 for file_name in sorted(glob.glob(path + "/*" + ext)): 11 print(file_name) # ./codes/page1_script.js 12 yield file_name

python:javascript_kindle.py

1# javascript_kindle.py 2# -*- coding:utf-8 -*- 3 4import os 5import extract 6files = os.listdir('./codes') 7filenum = len(files) + 1 8 9with open('./output.txt', 'w+') as f: 10 for file_name in extract.extract_files("./codes", ".js"): 11 with open(file_name, 'r') as file_data: 12 f.write('/' * 24 + '\n//' + os.path.basename(file_name) + '\n' + file_data.read() + '\n')

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Python

1def extract_last(): 2 filelist = os.listdir("./codes") 3 global filelistname 4 filelistname = filelist[0] # extract_last関数の呼び出しのこの行でグローバル変数が定義される。

extract.pyは変数:filelistnameをモジュールレベルで定義していなく かつ javascript_kindle.pyextract_lastの呼び出しを行っていないため、global(モジュールレベル)で変数定義できてないです。

◇対応案
案1,extract_last関数を呼び出してから変数を使用する。
案2,モジュールレベルで変数を先に定義しておく。

※スクリプトのやりたいことがよく分かりませんが、extract_last関数のreturnで値を返すのはだめなのでしょうか?

案2の対応です。
extract.py

Python

1filelistname = "" # PEP8に従うのなら、変数名は大文字で。 2index = 0 # 3def extract_last(): 4 # 以下省略

javascript_kindle.py

Python

1# 変数:indexにモジュール名(extract)が付いていないので追加 2file_data = open('./codes/page' + str(i) + extract.filelistname[extract.index:], 'r')

◇参考情報
global 文


Pythonのバージョンが分かりませんでしたので、バージョンに限定されない書き方にします。
失礼しました、質問文にバージョン2.7と書いてありました。
**モジュールの事はまず忘れてください。**まず一連のファイル名を取得する関数を作ります。
拡張子を指定してファイル一覧を取得にはglob.globが使えます。
◇参考情報
Pythonでフォルダ内のファイルリストを取得する

Python

1import glob 2import os 3 4def extract_files(path, ext): 5 """ 6 :params path 検索フォルダ 7 :params ext 拡張子 8 """ 9 for file_name in sorted(glob.glob(path + "/*" + ext)): 10 # 同じ拡張子で除外したいファイルがもしあれば、この位置でif文で判断してください。 11 print(file_name) 12 # ファイル名を1個ずつyieldで返す。 13 yield file_name 14 15# 呼び出し方法 16print(list(extract_files("./codes", ".js")))

次にこの関数を使ってforループで回します。

Python

1with open('./output.txt', 'w+') as f: 2 for file_name in extract_files("./codes", ".js"): 3 print("/" * 24) 4 print(file_name) 5 print(os.path.basename(file_name)) 6

その後、上記関数をextract_files関数をextract.pyに記述を移し、javascript_kindle.pyextract_filesの呼び出し部分をextract.extract_filesに変更します。
この手順でモジュール化ができます。


以下はサンプルコードです。
extract.py

Python

1# -*- coding: utf-8 -*- 2import glob 3 4 5def extract_files(path, ext): 6 """ 7 :params path 検索フォルダ 8 :params ext 拡張子 9 :return ファイル名 10 """ 11 for file_name in glob.iglob(path + "/*" + ext): 12 print(file_name) 13 yield file_name 14 15 16def main(): 17 print(list(extract_files("./codes", ".js"))) 18 19 20if __name__ == "__main__": 21 main()

javascript_kindle.py

Python

1# -*- coding: utf-8 -*- 2import os 3import extract 4 5 6def main(): 7 with open('./output.txt', 'w+') as f: 8 for file_name in extract.extract_files("./codes", ".js"): 9 with open(file_name, 'r') as file_data: 10 f.write('/' * 24 + '\n//page//' + os.path.basename(file_name) + '\n' + file_data.read() + '\n') 11 12 13if __name__ == "__main__": 14 main() 15

投稿2018/08/02 22:43

編集2018/08/03 20:51
umyu

総合スコア5846

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Yukiya025

2018/08/03 11:13 編集

umyu様 第二の案を採用し、コードを修正し赤い×印は消えました! ありがとうございます(≧∀≦) しかし `IOError: [Errno 2] No such file or directory: './codes/page1'` とエラーが出ています。 `filelistname[index:]` (extact.py) と `extract.filelistname[extract.index:]` (javascript_kindle.py) の中に何もデータが入っていないようです。 どうすれば入るようになるでしょうか(?_?) ちなみに、このコードは[[実際のコード付き by Python] Progateからダウンロードしたコードをkindleで読みたい!](https://qiita.com/Yukiya025/items/c80b143427ceaa343c22) (複数のファイルの内容を一つのファイルにまとめる)ことを目的に作っています。 codesフォルダの中にpage1_script.js...とファイル名が数字の部分のみが変わっていくので、「_script.jsの部分も自動でPythonが取ってくるように改良しよう (Progateのコースはほかに_script.rbなどがあるので)」と思いついたはいいもののglobal変数ではまっていますorz 修正したコード↓ ```python:extract.py # extract.py filelistname = "" index = 0 def extract_last(): filelist = os.listdir("./codes") print(filelist) global filelistname filelistname = filelist[0] # extract_last関数の呼び出しのこの行でグローバル変数が定義される。 # [_]以降のファイル名を取得 index = filelistname.find('_') print(filelistname[index:]) ``` ```python:javascript_kindle.py # javascript_kindle.py files = os.listdir('./codes') filenum = len(files) + 1 with open('./output.txt', 'w+') as f: for i in range(1, filenum): print(extract.filelistname[extract.index:]) # 変数:indexにモジュール名(extract)が付いていないので追加 file_data = open('./codes/page' + str(i) + extract.filelistname[extract.index:], 'r') f.write('////////////////////////\n//page' + str(i) + extract.filelistname[extract.index:] + '\n' + file_data.read() + '\n') ``` ヒントをいただけたのに自分で解決できないのが悔しく、回答をお願いするのも2度目で心苦しいのですがまたヒントをいただけないでしょうか(>_<)
Yukiya025

2018/08/04 22:39

ありがとうございますm(;∇;)m ファイル名を取得する関数、forループの書き方、サンプルコードをずっと画面上で見ているとコードが右から左に滑りだしたので (末期) Atomにexport-htmlパッケージをインストールして印刷しました。 (↑Atomに印刷機能が標準装備されていないことを今回初めて知るw) ボールペンでumyu様の指示をコード横に書き込んでやっと理解できてコードに落とし込めました!!! もともと長々とPC画面を見るのがつらいしモバイルルーター持ってないしでコードをkindleで読めるように、覚えたてのPython@Progateでばらばらになっているファイルを自動でひとつにするプログラムを書こうとしてどこが悪いのかわからずでも動いてくれないのはよくわかるという状態だったので本当に助かりました (T_T) これでkindleをよりフル活用できる。。。(v≧∇≦)v 完成したコードはコメント欄ではなく質問文に載せました。 (コメント欄ではマークダウンが使えない? ため)
umyu

2018/08/05 06:03

@Yukiya025さんへ 解決してよかったですー。 解決方法のまとめありがとうございました。
Yukiya025

2018/08/05 11:47

いえいえ、こちらこそxD ありがとうございます(≧∀≦)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問