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

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

ただいまの
回答率

90.76%

  • Python 3.x

    5320questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

教科書の手順でのテキストファイルが開けません

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 245

James1201

score 7

教科書の中のテキストを読み込むコードなのですが、テキストファイルを教科書内のものではない別のものにすると読み込めなくなりました。
やはりテキストデータの違いによるものなのでしょうか・・・、

from janome.tokenizer import Tokenizer
import os, glob

# Janomeを使って形態素解析を行う
ja_tokenizer = Tokenizer()

#日本語を分かち書き
def ja_tokenize(text):
    res = []
    lines = text.split("\n")
    #lines = lines[2:] # 最初の2行はヘッダー情報なので捨てる
    for line in lines:
        malist = ja_tokenizer.tokenize(line)
        for tok in malist:
            ps = tok.part_of_speech.split(",")[0]
            if not ps in['名詞', '動詞', '形容詞']: continue
            w = tok.base_form
            if w == "*" or w == "":  w = tok.surface
            if w == "" or w == "\n": continue
            res.append(w)
        res.append("\n")
    return res

# テストデータを読み込み
root_dir = './Isojintext'
for path in tqdm(glob.glob(root_dir+"**/*.txt", recursive=True)):
        if path.find("LICENSE") > 0:  continue
        print(path)
        path_wakati = path + ".wakati"
        if os.path.exists(path_wakati): continue
        text = open(path,"r").read()
        words = ja_tokenize(text)
        wt = " ".join(words)
        open(path_wakati, "w", encoding="utf-8").write(wt)


混み込めていたテキスト一例
./newstext
イメージ説明
読み込めなかったテキスト一例
./Isojintext
イメージ説明

 エラー内容

 0%|          | 0/23 [00:00<?, ?it/s]
./Isojintext/eq_0312.txt

---------------------------------------------------------------------------
OSError                                   Traceback (most recent call last)
<ipython-input-
88-171f9eae8e3f> in <module>()
      6         path_wakati = path + ".wakati"
      7         if os.path.exists(path_wakati): continue
----> 8         text = open(path,"r").read()
      9         words = ja_tokenize(text)
     10         wt = " ".join(words)

OSError: [Errno 22] Invalid argument

 エラー内容2

0%|          | 0/23 [00:00<?, ?it/s]
./isojintext/eq_0312.txt

---------------------------------------------------------------------------
OSError                                   Traceback (most recent call last)
<ipython-input-25-15e4194c1e08> in <module>()
      7         if os.path.exists(path_wakati): continue
      8         f = open(path, "r")
----> 9         text = f.read()
     10         words = ja_tokenize(text)
     11         wt = " ".join(words)

OSError: [Errno 22] Invalid argument


```

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+2

tqdm(glob.glob(root_dir+"**/*.txt", recursive=True))をpathに設定していることが原因ではないでしょうか。pathに設定するべきなのはglob.glob(root_dir+"**/*.txt", recursive=True) で取得したファイル一覧のはずです。
とりあえず、tqdm()を外してfor i in glob.glob(root_dir+"**/*.txt", recursive=True)
としてみてはいかがでしょうか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/26 18:38

    ありがとうございます。
    ご指摘いただいた通りやってみましたが、エラー内容は変わりませんでした・・・。

    キャンセル

checkベストアンサー

+1

----> 8         text = open(path,"r").read()

OSError: [Errno 22] Invalid argument
なので、問題があるのは恐らくpathです。

とりあえず、macは大文字小文字区別しないので、そこで問題になり得るか・・・? './Isojintext'を'./isojintext'にして、ディレクトリ名の方も変更して走らせてみてください。
駄目だったら、

f = open(path,"r")
text = f.read()


二行に分けてどっちが駄目なのか特定しましょう。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/26 18:44

    ありがとうございます。
    ご指摘の通り修正したところ、エラー内容が上記「エラー内容2」のようになりました。
    これは、そもそもファイルが読み込めていないということでしょうか・・・

    キャンセル

  • 2018/04/26 23:59

    パスは大丈夫だけど、読もうとすると駄目ですか・・・
    ちなみに、どれくらいのファイル容量ですか?

    キャンセル

  • 2018/04/27 10:23

    2.93GBです・・・!

    キャンセル

  • 2018/04/27 10:39

    これかもしれません・・・!
    https://stackoverflow.com/questions/48122798/oserror-errno-22-invalid-argument-when-reading-a-huge-file
    https://bugs.python.org/issue24658

    キャンセル

  • 2018/04/27 10:42

    え、ということは2.93GB級のがisojintext以下にたくさんあるという理解で良いですか? それとも複数あるファイルの合計が2.93GB?

    キャンセル

  • 2018/05/01 20:39

    親身に考えて下さって有難うございました・・・!
    はい、3,4GBクラスのテキストファイルが30個くらいあるという状況です。
    訳あって今回のコードは一旦使わないことになったので、BAにして締めさせていただきます・・・!

    キャンセル

  • 2018/05/01 20:39

    回答が遅れて申し訳ありません!

    キャンセル

  • 2018/05/01 20:40

    あっ、そうですか
    一応100文字ずつ読むとか、一行ずつ読むとかで処理できる可能性はあるので、今後必要になったら参考にしてください

    キャンセル

  • 2018/05/01 20:41

    有難うございます!m(_ _)m

    キャンセル

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

  • ただいまの回答率 90.76%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Python 3.x

    5320questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。