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

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

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

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1082閲覧

colaboratoryでのファイル読み込みについて

hershel

総合スコア13

Python 3.x

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2018/05/13 14:41

編集2018/05/13 14:55

将棋AIの作成のためgoogle colaboratoryで以下のコードを動かしました。
ディレクトリはgoogle drive内に作ったファイルで、その中に棋譜のパスが書かれたテキストファイル(kifulist_train_1000.txt kifulist_test_100.txt)と、棋譜が書かれたcsaが入っている2016という名前のファイルがあります。

コード

lang

1 2import numpy as np 3import chainer 4from chainer import cuda, Variable 5from chainer import optimizers, serializers 6import chainer.functions as F 7 8from pydlshogi.common import * 9from pydlshogi.network.policy import PolicyNetwork 10from pydlshogi.features import * 11from pydlshogi.read_kifu import * 12 13import argparse 14import random 15import pickle 16import os 17import re 18 19import logging 20 21 22 23import easydict 24args = easydict.EasyDict({ 25 'kifulist_train':'kifulist_train_1000.txt', 26 'kifulist_test':'kifulist_test_100.txt', 27 'batchsize':32, 28 'test_batchsize':512, 29 'epoch':1, 30 'model':'model/model_policy', 31 'state':'model/state_policy', 32 'initmodel':'', 33 'resume':'', 34 'log':None, 35 'lr':0.01, 36 'eval_interval':100 37}) 38 39 40logging.basicConfig(format='%(asctime)s\t%(levelname)s\t%(message)s', datefmt='%Y/%m/%d %H:%M:%S', filename=args.log, level=logging.DEBUG) 41 42model = PolicyNetwork() 43model.to_gpu() 44 45optimizer = optimizers.SGD(lr=args.lr) 46optimizer.setup(model) 47 48# Init/Resume 49if args.initmodel: 50 logging.info('Load model from {}'.format(args.initmodel)) 51 serializers.load_npz(args.initmodel, model) 52if args.resume: 53 logging.info('Load optimizer state from {}'.format(args.resume)) 54 serializers.load_npz(args.resume, optimizer) 55 56logging.info('read kifu start') 57# 保存済みのpickleファイルがある場合、pickleファイルを読み込む 58# train date 59train_pickle_filename = re.sub(r'..*?$', '', args.kifulist_train) + '.pickle' 60if os.path.exists(train_pickle_filename): 61 with open(train_pickle_filename, 'rb') as f: 62 positions_train = pickle.load(f) 63 logging.info('load train pickle') 64else: 65 positions_train = read_kifu(args.kifulist_train) 66 67# test data 68test_pickle_filename = re.sub(r'..*?$', '', args.kifulist_test) + '.pickle' 69if os.path.exists(test_pickle_filename): 70 with open(test_pickle_filename, 'rb') as f: 71 positions_test = pickle.load(f) 72 logging.info('load test pickle') 73else: 74 positions_test = read_kifu(args.kifulist_test) 75 76# 保存済みのpickleがない場合、pickleファイルを保存する 77if not os.path.exists(train_pickle_filename): 78 with open(train_pickle_filename, 'wb') as f: 79 pickle.dump(positions_train, f, pickle.HIGHEST_PROTOCOL) 80 logging.info('save train pickle') 81if not os.path.exists(test_pickle_filename): 82 with open(test_pickle_filename, 'wb') as f: 83 pickle.dump(positions_test, f, pickle.HIGHEST_PROTOCOL) 84 logging.info('save test pickle') 85logging.info('read kifu end') 86 87logging.info('train position num = {}'.format(len(positions_train))) 88logging.info('test position num = {}'.format(len(positions_test))) 89 90# mini batch 91def mini_batch(positions, i, batchsize): 92 mini_batch_data = [] 93 mini_batch_move = [] 94 for b in range(batchsize): 95 features, move, win = make_features(positions[i + b]) 96 mini_batch_data.append(features) 97 mini_batch_move.append(move) 98 99 return (Variable(cuda.to_gpu(np.array(mini_batch_data, dtype=np.float32))), 100 Variable(cuda.to_gpu(np.array(mini_batch_move, dtype=np.int32)))) 101 102def mini_batch_for_test(positions, batchsize): 103 mini_batch_data = [] 104 mini_batch_move = [] 105 for b in range(batchsize): 106 features, move, win = make_features(random.choice(positions)) 107 mini_batch_data.append(features) 108 mini_batch_move.append(move) 109 110 return (Variable(cuda.to_gpu(np.array(mini_batch_data, dtype=np.float32))), 111 Variable(cuda.to_gpu(np.array(mini_batch_move, dtype=np.int32)))) 112 113# train 114logging.info('start training') 115itr = 0 116sum_loss = 0 117for e in range(args.epoch): 118 positions_train_shuffled = random.sample(positions_train, len(positions_train)) 119 120 itr_epoch = 0 121 sum_loss_epoch = 0 122 for i in range(0, len(positions_train_shuffled) - args.batchsize, args.batchsize): 123 x, t = mini_batch(positions_train_shuffled, i, args.batchsize) 124 y = model(x) 125 126 model.cleargrads() 127 loss = F.softmax_cross_entropy(y, t) 128 loss.backward() 129 optimizer.update() 130 131 itr += 1 132 sum_loss += loss.data 133 itr_epoch += 1 134 sum_loss_epoch += loss.data 135 136 # print train loss and test accuracy 137 if optimizer.t % args.eval_interval == 0: 138 x, t = mini_batch_for_test(positions_test, args.test_batchsize) 139 y = model(x) 140 logging.info('epoch = {}, iteration = {}, loss = {}, accuracy = {}'.format(optimizer.epoch + 1, optimizer.t, sum_loss / itr, F.accuracy(y, t).data)) 141 itr = 0 142 sum_loss = 0 143 144 # validate test data 145 logging.info('validate test data') 146 itr_test = 0 147 sum_test_accuracy = 0 148 for i in range(0, len(positions_test) - args.batchsize, args.batchsize): 149 x, t = mini_batch(positions_test, i, args.batchsize) 150 y = model(x) 151 itr_test += 1 152 sum_test_accuracy += F.accuracy(y, t).data 153 logging.info('epoch = {}, iteration = {}, train loss avr = {}, test accuracy = {}'.format(optimizer.epoch + 1, optimizer.t, sum_loss_epoch / itr_epoch, sum_test_accuracy / itr_test)) 154 155 optimizer.new_epoch() 156 157logging.info('save the model') 158serializers.save_npz(args.model, model) 159logging.info('save the optimizer') 160serializers.save_npz(args.state, optimizer)

下のようなエラーが出ました

2018/05/13 14:21:43 INFO read kifu start --------------------------------------------------------------------------- OSError Traceback (most recent call last) <ipython-input-32-371f8040b06a> in <module>() 75 logging.info('load train pickle') 76 else: ---> 77 positions_train = read_kifu(args.kifulist_train) 78 79 # test data /content/drive/shogi-1/pydlshogi/read_kifu.py in read_kifu(kifu_list_file) 11 for line in f.readlines(): 12 filepath = line.rstrip('\r\n') ---> 13 kifu = shogi.CSA.Parser.parse_file(filepath)[0] 14 win_color = shogi.BLACK if kifu['win'] == 'b' else shogi.WHITE 15 board = shogi.Board() /usr/local/lib/python3.6/dist-packages/shogi/CSA.py in parse_file(path) 64 @staticmethod 65 def parse_file(path): ---> 66 with open(path) as f: 67 return Parser.parse_str(f.read()) 68 OSError: [Errno 5] Input/output error: '2016\wdoor+floodgate-600-10F+gikou_1c+gpsfish_normal_1c+20160821170008.csa'

棋譜のパスが書かれたファイルには2016\wdoor+floodgate-600-10F+gikou_1c+gpsfish_normal_1c+20160821170008.csa としているのですが読み込む際2016\wdoor+floodgate-600-10F+gikou_1c+gpsfish_normal_1c+20160821170008.csa というファイルを探し出そうとしています。
正しいパスを読み込ませようと考えましたが方法がわかりません。
もしよければご教授いただけると幸いです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

表示がエスケープされているだけで文字列自体は正しい可能性もあります。エラーメッセージでどっちになるか(エスケープされるかどうか)はちょっとわからないので、エラー箇所直前(13行に挿入)でprint(filepath)してみてください。

投稿2018/05/13 15:00

hayataka2049

総合スコア30933

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

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

hershel

2018/05/13 15:34

返信ありがとうございます。 read_kifu.pyの13行目にprint(filepath)としたところエラーメッセージは以下のようになりました。 2018/05/13 15:29:05 INFO read kifu start 2016\wdoor+floodgate-600-10F+gikou_1c+gpsfish_normal_1c+20160821170008.csa --------------------------------------------------------------------------- FileNotFoundError Traceback (most recent call last) <ipython-input-9-371f8040b06a> in <module>() 75 logging.info('load train pickle') 76 else: ---> 77 positions_train = read_kifu(args.kifulist_train) 78 79 # test data /content/drive/shogi-1/pydlshogi/read_kifu.py in read_kifu(kifu_list_file) 12 filepath = line.rstrip('\r\n') 13 print(filepath) ---> 14 kifu = shogi.CSA.Parser.parse_file(filepath)[0] 15 win_color = shogi.BLACK if kifu['win'] == 'b' else shogi.WHITE 16 board = shogi.Board() /usr/local/lib/python3.6/dist-packages/shogi/CSA.py in parse_file(path) 64 @staticmethod 65 def parse_file(path): ---> 66 with open(path) as f: 67 return Parser.parse_str(f.read()) 68 FileNotFoundError: [Errno 2] No such file or directory: '2016\wdoor+floodgate-600-10F+gikou_1c+gpsfish_normal_1c+20160821170008.csa' 文字列自体は正しく認識されているという事でしょうか? そしてエラーメッセージのError5がError2に変化していますがよくわかりません。
hayataka2049

2018/05/13 15:41

2016\wdoor+floodgate-600-10F+gikou_1c+gpsfish_normal_1c+20160821170008.csaがprintの出力ですか? それなら、文字列としては正しいのでしょう No such file or directoryになったのは、カレントディレクトリでも変わったのでは?
hershel

2018/05/14 04:57

カレントディレクトリが変わってました。 戻したらもとのエラーに戻りました。 ファイル名は正しく読み込まれているのに探せないというのはどういうことなのでしょうか? Windowsでは動いただけにcolaboratoryでの挙動の理由がわかりません。
hershel

2018/05/14 08:39

情報ありがとうございます。 driveをディレクトリとしてマウントすることには成功していたようで、 ’# drive mean root directory of google drive !mkdir -p drive !google-drive-ocamlfuse drive !ls drive/csaがあるファイルパス’ としたところcsaファイルがアップデートされていることが確認できました。 このcsaファイルが入っているディレクトリに移動してkifu=shogi.CSA.Parser.parse_file('ファイル名)[0]としたところ棋譜を読み込めました。 しかし一つ上のディレクトリからファイル名を'フォルダ\ファイル名'として同様に棋譜を読み込んだ場合は上のエラーが発生しました。 一度コードやテキスト内のファイル名を書き換え、ディレクトリの位置をいろいろ変えることで動かしてみます。
hershel

2018/05/14 14:08

棋譜が入っているディレクトリに全てのコードを移動することで無事にcolaboratoryでの学習を行うことができました。 パスがファイル名のみの場合では読み込みができてもディレクトリを含めたパスだと読み込めないという状況だったようです? なんにせよ解決できたので良かったです hayataka2049さんありがとうございました。 行動の指針がわかりやすくなり非常に助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問