Pythonのファイルのバイト単位でのランダムアクセスについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
keito94
記事: 264
登録日時: 1年前
連絡を取る:

Pythonのファイルのバイト単位でのランダムアクセスについて

#1

投稿記事 by keito94 » 10ヶ月前

今、Pythonを使って、MapEditor Quoyle ver0.8のヘルプを参考に、Quolyeで作ったマップデータのローダーを作っているのですが
Pythonのランダムアクセスについて調べていると、
https://docs.python.jp/3/library/linecache.html
テキストライン関係のものしか出ません。
どうやってバイト単位でのランダムアクセスを行うのですか?
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。

アバター
keito94
記事: 264
登録日時: 1年前
連絡を取る:

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#2

投稿記事 by keito94 » 10ヶ月前

Pythonのreadをよく読めばいいだけのことでした。
お付き合い頂きありがとうございました。
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。

アバター
keito94
記事: 264
登録日時: 1年前
連絡を取る:

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#3

投稿記事 by keito94 » 10ヶ月前

でも、Pythonのread機能で、どうやってバイナリデータのランダムアクセスとバイト数だけ読み込みを実現させるのかがわからない…。
すいません解決はなかったことにしてください。
最後に編集したユーザー keito94 on 2017年7月29日(土) 13:24 [ 編集 1 回目 ]
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。

アバター
keito94
記事: 264
登録日時: 1年前
連絡を取る:

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#4

投稿記事 by keito94 » 10ヶ月前

とりあえずソースコード。

コード:

# 細かいデータはQuolyeのヘルプを見てください。
def Map_Load(filename):
    fn = open(filename,'rb')
    # Widthのビッグ、リトルエンディアン。
    W_B = int(fn.read(0))
    W_L = int(fn.read(1))
    # マップの幅。
    MAP_W = W_L | (W_B << 8)

    # Heightのビッグ、リトルエンディアン。
    H_B = int(fn.read(2))
    H_L = int(fn.read(3))
    # マップの高さ。
    MAP_H = H_L | (H_B << 8)

    CW_B = int(fn.read(4))
    CW_L = int(fn.read(5))
    CHIP_W = CW_L | (CW_B << 8)

    CH_B = int(fn.read(6))
    CH_L = int(fn.read(7))
    CHIP_H = CH_L | (CH_B << 8)

    LAYER_C = int(fn.read(8))
    CHIP_COUNT = int(fn.read(9))

    if CHIP_COUNT != 0:
        # マップチップは16ビット、2バイト。
        chipbyte = 2
        bit = 65536
    else:
        # マップチップは8ビット、1バイト。
        chipbyte = 1
        bit = 256

    for z in range(LAYER_C):
        for y in range(CHIP_H):
            for x in range(CHIP_W):
                # マップデータの書き込み。
                pass
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。

アバター
Hiragi(GKUTH)
記事: 167
登録日時: 7年前
住所: 大阪府
連絡を取る:

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#5

投稿記事 by Hiragi(GKUTH) » 10ヶ月前

ファイル自体をランダムアクセスしようとするのではなく、ファイルを読み込んでメモリ上に展開してからのほうが扱いやすいのではないですか?
全く的外れでした。申し訳ありません。
そもそもなぜランダムアクセスが必要となったのですか?
だいがくせい!

shira211
記事: 13
登録日時: 2年前

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#6

投稿記事 by shira211 » 10ヶ月前

エンディアンの言葉の使い方が間違っています。リトル・ビッグエンディアンではなく、下位・上位バイトと呼ぶのが適切かと思います。
それ以外の用語も、もしかしたら間違って使っているのではないですか?
ランダムアクセスとバイト数だけ読み込みとは、具体的にどのような動作を指すのでしょうか?

アバター
keito94
記事: 264
登録日時: 1年前
連絡を取る:

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#7

投稿記事 by keito94 » 10ヶ月前

shira211 さんが書きました:エンディアンの言葉の使い方が間違っています。リトル・ビッグエンディアンではなく、下位・上位バイトと呼ぶのが適切かと思います。
ごめんなさい、訂正しておきますね…。
それ以外の用語も、もしかしたら間違って使っているのではないですか?
ランダムアクセスとバイト数だけ読み込みとは、具体的にどのような動作を指すのでしょうか?
ランダムアクセスはread()関数を使えばできるということはわかりました。
ですが、
①ランダムアクセスは簡単にできた。
②でも、(Pythonにおける)1バイト単位のアクセスのやり方がわからない
これくらいでしょうか…。
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。

アバター
Hiragi(GKUTH)
記事: 167
登録日時: 7年前
住所: 大阪府
連絡を取る:

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#8

投稿記事 by Hiragi(GKUTH) » 10ヶ月前

>>②でも、(Pythonにおける)1バイト単位のアクセスのやり方がわからない
read関数の第一引数は読み込むバイト数ですので、readの第一引数に1を渡してやればいいかと思います。(提示されたソースでは使い方を間違っている?)
それとkeito94さんが想像しているランダムアクセスは私の考えるランダムアクセスとは違うかもしれません。少なくともread関数ではランダムアクセスは出来ず、
seek関数を使用する必要があると思います。
だいがくせい!

アバター
keito94
記事: 264
登録日時: 1年前
連絡を取る:

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#9

投稿記事 by keito94 » 10ヶ月前

Hiragi(GKUTH) さんが書きました: seek関数を使用する必要があると思います。
わかりました!!seek関数を使えばいいんですね!!
ありがとうございました!!
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。

アバター
keito94
記事: 264
登録日時: 1年前
連絡を取る:

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#10

投稿記事 by keito94 » 10ヶ月前

しまった解決押し忘れた(><)
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。

アバター
asd
記事: 300
登録日時: 7年前

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#11

投稿記事 by asd » 10ヶ月前

keito94 さんが書きました:
Hiragi(GKUTH) さんが書きました: seek関数を使用する必要があると思います。
わかりました!!seek関数を使えばいいんですね!!
ありがとうございました!!
最終的にseek関数を使ったソースが出来上がったらそれを解決の証として貼り付けておいてください。
Advanced Supporting Developer
無理やりこじつけ(ぉ

アバター
keito94
記事: 264
登録日時: 1年前
連絡を取る:

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#12

投稿記事 by keito94 » 10ヶ月前

コード:

# 細かいデータはQuolyeのヘルプを見てください。
class Map:
    def __init__(self,filename):
        self.fn = open(filename, 'rb')
        # マップの幅を獲得。
        W_B = int(self.fn.read(1))
        self.fn.seek(1)
        W_L = int(self.fn.read(1))
        self.MAP_W = W_L | (W_B << 8)

        # マップの高さを獲得。
        self.fn.seek(1)
        H_B = int(self.fn.read(1))
        self.fn.seek(1)
        H_L = int(self.fn.read(1))
        self.MAP_H = H_L | (H_B << 8)

        # マップチップの幅を獲得。
        self.fn.seek(1)
        CW_B = int(self.fn.read(1))
        self.fn.seek(1)
        CW_L = int(self.fn.read(1))
        self.CHIP_W = CW_L | (CW_B << 8)

        # マップチップの高さを獲得。
        self.fn.seek(1)
        CH_B = int(self.fn.read(1))
        self.fn.seek(1)
        CH_L = int(self.fn.read(1))
        self.CHIP_H = CH_L | (CH_B << 8)

        self.fn.seek(1)
        self.LAYER_C = int(self.fn.read(1))
        self.fn.seek(1)
        self.CHIP_COUNT = int(self.fn.read(1))

        if self.CHIP_COUNT != 0:
            # マップチップは16ビット、2バイト。
            self.chipbyte = 2
            self.bit = 256
        else:
            # マップチップは8ビット、1バイト。
            self.chipbyte = 1
            self.bit = 16

        self.fn.seek(5)
        self.movebyte = 0
多分これ効率が悪いのかもしれませんけど…。
オフトピック
沖さんの日記のASDさんのコメント読みました…。
これから態度を改められる訓練をしなければ…。
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。

アバター
keito94
記事: 264
登録日時: 1年前
連絡を取る:

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#13

投稿記事 by keito94 » 10ヶ月前

さっき書いたコードは効率がかなり悪いことに気づいて、load関数というものを作りました。

コード:

    # ファイルから一文字読み出す。nは読み込むファイルのオフセット。
    def load(self,n):
        self.fn.seek(n)
        self.fn.read(1)
        self.fn.seek(-n)
すると、どうでしょう!!

コード:

class Map:
    # マップを開いてヘッダ情報を読み込む。引数:filename(ファイルのパス。)
    def __init__(self,filename):
        self.fn = open(filename, 'rb')
        # マップの幅を獲得。
        W_B = int(self.load(0))
        W_L = int(self.load(1))
        self.MAP_W = W_L | (W_B << 8)

        # マップの高さを獲得。
        H_B = int(self.load(2))
        H_L = int(self.load(3))
        self.MAP_H = H_L | (H_B << 8)

        # マップチップの幅を獲得。
        CW_B = int(self.load(4))
        CW_L = int(self.load(5))
        self.CHIP_W = CW_L | (CW_B << 8)

        CH_B = int(self.load(6))
        CH_L = int(self.load(7))
        self.CHIP_H = CH_L | (CH_B << 8)

        self.LAYER_C = int(self.load(8))
        self.CHIP_COUNT = int(self.load(9))

        if self.CHIP_COUNT != 0:
            self.bysize = 2
        else:
            self.bysize = 1

コードがかなりすっきりしました。
今度こそありがとうございました。
オフトピック
今回の教訓。最後まで確認してから解決させるべし。
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。

アバター
asd
記事: 300
登録日時: 7年前

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#14

投稿記事 by asd » 10ヶ月前

解決したソースの投稿ありがとうございました。
解決したのであれば解決!にチェックを入れておいてください。
keito94 さんが書きました:
オフトピック
沖さんの日記のASDさんのコメント読みました…。
これから態度を改められる訓練をしなければ…。
オフトピックにツッコミいれるのもなんですが、このトピック外の話を混ぜるのやめませんか?
第三者からみて意味が分からなくなりますので。
Advanced Supporting Developer
無理やりこじつけ(ぉ

ISLe
記事: 2610
登録日時: 7年前
連絡を取る:

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#15

投稿記事 by ISLe » 10ヶ月前

オフトピック
ファイルの先頭から10バイトは順番に読み込むだけだし
structモジュールとかいうのを使うと複数バイトデータの変換が楽にできるらしい。
こんな感じ?(未検証)

コード:

from struct import *

class Map:
    # マップを開いてヘッダ情報を読み込む。引数:filename(ファイルのパス。)
    def __init__(self,filename):
        self.fn = open(filename, 'rb')
        # マップの幅を獲得。
        self.MAP_W = unpack('>h', self.fn.read(2))[0] # '>' : bigendian  'h' : signed short (2bytes)
 
        # マップの高さを獲得。
        self.MAP_H = unpack('>h', self.fn.read(2))[0]
 
        # マップチップの幅を獲得。
        self.CHIP_W = unpack('>h', self.fn.read(2))[0]

        # マップチップの高さを獲得。
        self.CHIP_H = unpack('>h', self.fn.read(2))[0]
 
        self.LAYER_C = unpack('b', self.fn.read(1))[0] # 'b' : signed byte
        self.CHIP_COUNT = unpack('b', self.fn.read(1))[0]

        #以下略
ここからreadShortとかreadByteとかの関数作って置き換える流れが順当。

アバター
沖 滉均
記事: 237
登録日時: 7年前
住所: K県F市

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#16

投稿記事 by 沖 滉均 » 10ヶ月前

keito94 さんが書きました:さっき書いたコードは効率がかなり悪いことに気づいて、load関数というものを作りました。

コード:

    # ファイルから一文字読み出す。nは読み込むファイルのオフセット。
    def load(self,n):
        self.fn.seek(n)
        self.fn.read(1)
        self.fn.seek(-n)
オフトピック
今回の教訓。最後まで確認してから解決させるべし。
とりあえず返信しますが動作確認しましたか?

・load関数は値を返していない
・self.fn.seek関数は第2引数を省略しているため、nは 0もしくは正の値でなければならない(第2引数にos.SEEK_SET(デフォルト)を指定した場合と同様)

他にも問題だらけなのでドキュメント確認しましょうね。以前のトピで出たprint文デバッグでも良いでしょう。
これ以上、他の問題点について私は答えるつもりはありませんのでデバッグをしてくださいね
There is no royal road to learning.
codeタグで指定できる言語

アバター
keito94
記事: 264
登録日時: 1年前
連絡を取る:

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#17

投稿記事 by keito94 » 10ヶ月前

ISLe さんが書きました: ここからreadShortとかreadByteとかの関数作って置き換える流れが順当。
readShortとreadByteがネイティブコード(C言語)で書かれた変数をPythonの整数に変換するというのはわかるのですが…。
それのヒントらしきものはありますか?
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。

アバター
asd
記事: 300
登録日時: 7年前

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#18

投稿記事 by asd » 9ヶ月前

keito94 さんが書きました:
ISLe さんが書きました: ここからreadShortとかreadByteとかの関数作って置き換える流れが順当。
readShortとreadByteがネイティブコード(C言語)で書かれた変数をPythonの整数に変換するというのはわかるのですが…。
それのヒントらしきものはありますか?
オフトピックにだけ反応してload関数対応版について、沖さん指摘の動作確認をしたかどうかはスルーですか?

動くかどうかわからないソースを載せて解決とされると、同じような問題で困っている人が参照した際に困ってしまいます。
Advanced Supporting Developer
無理やりこじつけ(ぉ

アバター
沖 滉均
記事: 237
登録日時: 7年前
住所: K県F市

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#19

投稿記事 by 沖 滉均 » 9ヶ月前

keito94 さんが書きました:ISLe さんが書きました:
ここからreadShortとかreadByteとかの関数作って置き換える流れが順当。

readShortとreadByteがネイティブコード(C言語)で書かれた変数をPythonの整数に変換するというのはわかるのですが…。
それのヒントらしきものはありますか?
structモジュールって書いてあるのだからドキュメントを読んではいかがですか?
Python 3.6.1 ドキュメント
There is no royal road to learning.
codeタグで指定できる言語

アバター
keito94
記事: 264
登録日時: 1年前
連絡を取る:

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#20

投稿記事 by keito94 » 9ヶ月前

2バイトのやつはリトルエンディアンですよ。(output_d.htmlを読めばわかりますが…。)
さてさて、readShortと、readByteを完成させました。

コード:

    def readShort(self,val):
        return unpack('<h',val)[0]

    def readByte(self,val):
        return unpack('b',val)[0]

ですが、以下のようなエラーが出ました。
ボクとしては惜しい所まで来たのですが…。

コード:

マップの幅を獲得します。
マップの高さを獲得します。
マップチップの幅を獲得します。
マップチップの高さを獲得します。
レイヤーの数を獲得します。
チップカウントを獲得します。
マップチップの位置を読み取ります。
Traceback (most recent call last):
マップチップの位置を読み取ります。
マップチップの位置を読み取ります。
  File "C:/Users/keito940/PycharmProjects/quoyletest/test.py", line 53, in <module>
マップチップの位置を読み取ります。
マップチップの位置を読み取ります。
マップチップの位置を読み取ります。
マップチップの位置を読み取ります。
マップチップの位置を読み取ります。
マップチップの位置を読み取ります。
マップチップの位置を読み取ります。
マップチップの位置を読み取ります。
マップチップの位置を読み取ります。
マップチップの位置を読み取ります。
マップチップの位置を読み取ります。
マップチップの位置を読み取ります。
マップチップの位置を読み取ります。
マップチップの位置を読み取ります。
    main()
  File "C:/Users/keito940/PycharmProjects/quoyletest/test.py", line 41, in main
    map_data = map.data_load()
  File "C:\Users\keito940\PycharmProjects\quoyletest\quoyle\map.py", line 72, in data_load
    map_data[i][j] = self.get_pos(1, j, i)
IndexError: list assignment index out of range

Process finished with exit code 1

quoyletestフォルダにテストプログラムがあります。(Pygameが必要です。)
見えにくいですが、pygameのウィンドウにHELLOと表示されれば成功です。
あと、output_d.htmlには、使用しているマップファイルのデータが入っています。
ドキュメントはよく読んだのですが、
オフトピック
自分の脳内だけで補完せず、やりたいことを他人に伝える。
それが傲慢な態度、卒業の鍵。
添付ファイル
output_d.zip
(2.34 KiB) ダウンロード数: 21 回
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。

アバター
asd
記事: 300
登録日時: 7年前

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#21

投稿記事 by asd » 9ヶ月前

添付されているoutput_d.htmってマップエディタQuoyleに附属しているヘルプファイルの一部じゃないですか?
それを勝手に転載するのはよくないのではと思います。

いろいろツッコミを入れたいところですがどうせスルーされちゃうと思うので1点のみに絞って指摘しておきます。
keito94 さんが書きました: ですが、以下のようなエラーが出ました。
ボクとしては惜しい所まで来たのですが…。

コード:

マップの幅を獲得します。
マップの高さを獲得します。
マップチップの幅を獲得します。
マップチップの高さを獲得します。
レイヤーの数を獲得します。
チップカウントを獲得します。
マップチップの位置を読み取ります。
Traceback (most recent call last):
マップチップの位置を読み取ります。
マップチップの位置を読み取ります。
  File "C:/Users/keito940/PycharmProjects/quoyletest/test.py", line 53, in <module>
マップチップの位置を読み取ります。
マップチップの位置を読み取ります。
マップチップの位置を読み取ります。
マップチップの位置を読み取ります。
マップチップの位置を読み取ります。
マップチップの位置を読み取ります。
マップチップの位置を読み取ります。
マップチップの位置を読み取ります。
マップチップの位置を読み取ります。
マップチップの位置を読み取ります。
マップチップの位置を読み取ります。
マップチップの位置を読み取ります。
マップチップの位置を読み取ります。
マップチップの位置を読み取ります。
    main()
  File "C:/Users/keito940/PycharmProjects/quoyletest/test.py", line 41, in main
    map_data = map.data_load()
  File "C:\Users\keito940\PycharmProjects\quoyletest\quoyle\map.py", line 72, in data_load
    map_data[i][j] = self.get_pos(1, j, i)
IndexError: list assignment index out of range

Process finished with exit code 1

エラーが出たからだれかデバッグしてー、直し方教えてーではデバッグにはなりませんよ。
・エラーメッセージが何を意味しているか調べましたか?
・発生している場所がどこかは分かりますか?
・printデバッグで各パラメータを調べましたか?

もし自分でデバッグにあたりやったことがあればやったことを書いておくとよいですよ。
Advanced Supporting Developer
無理やりこじつけ(ぉ

アバター
沖 滉均
記事: 237
登録日時: 7年前
住所: K県F市

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#22

投稿記事 by 沖 滉均 » 9ヶ月前

keito94 さんが書きました:2バイトのやつはリトルエンディアンですよ。(output_d.htmlを読めばわかりますが…。)
さてさて、readShortと、readByteを完成させました。

コード:

    def readShort(self,val):
        return unpack('<h',val)[0]

    def readByte(self,val):
        return unpack('b',val)[0]

エラー報告は内容を自分で調べて自分でデバッグしてください
readShortとreadByteを作りましたとありますがこれだけで動いてないですよね?
使用箇所に問題があると思いますが、他の変更コードはどうなっているのですか?
あと、前回のload関数が値を返していない件に関しても返答がありませんね

他はasdさんが指摘されている通りなので省略します。
There is no royal road to learning.
codeタグで指定できる言語

アバター
keito94
記事: 264
登録日時: 1年前
連絡を取る:

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#23

投稿記事 by keito94 » 9ヶ月前

沖 滉均 さんが書きました: あと、前回のload関数が値を返していない件に関しても返答がありませんね
load関数はソースコードを見ればわかるように都合により廃止されました。
というか、structを使う方針に変更しました。
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。

アバター
沖 滉均
記事: 237
登録日時: 7年前
住所: K県F市

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#24

投稿記事 by 沖 滉均 » 9ヶ月前

ソースコードを見ればわかるように?
どこにそのようなソースコードがあるのですか?
There is no royal road to learning.
codeタグで指定できる言語

ISLe
記事: 2610
登録日時: 7年前
連絡を取る:

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#25

投稿記事 by ISLe » 9ヶ月前

オフトピック
keito94 さんが書きました:2バイトのやつはリトルエンディアンですよ。(output_d.htmlを読めばわかりますが…。)
keito94さんの提示したコードでビッグエンディアンとして処理しているのをそのまま書き換えたのですよ。

反省したと言いながらあいかわらずトピを読み返さないので自分の書いたコードに原因があることに気付かないのでしょうかね。
あるいは、わたしを貶めようと目論んでいるのでしょうか。

必要最低限の書き換えで済ましているのは、このような状況でもある意味keito94さんを信用してのことですが、そのような悪意を突き付けられるとは。
自分を棚に上げて他人に間違いを直させる姿勢にさらに磨きがかかってますね。

アバター
keito94
記事: 264
登録日時: 1年前
連絡を取る:

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#26

投稿記事 by keito94 » 9ヶ月前

沖 滉均 さんが書きました:ソースコードを見ればわかるように?
どこにそのようなソースコードがあるのですか?
output_d.zipのquoyletestの中に入ってると思うのですが…。
ちょっと不適切な名前だったので添付するファイルを修正しますね。(ソースコードは少し変えてます。)

今回のデバッグでわかったこと。
①レイヤーのアドレスの位置は(layer-1)で表す。
②流石にまずいと思い、load関数と、readByteを組み合わせた関数を作った。
③しかし、今のコードではnindexが適切な値を返さず、

コード:

TypeError: a bytes-like object is required, not 'int'
エラーを返す。
この場合どうすればいいのでしょうか?
添付ファイル
quoyletest.zip
(24.56 KiB) ダウンロード数: 19 回
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。

アバター
沖 滉均
記事: 237
登録日時: 7年前
住所: K県F市

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#27

投稿記事 by 沖 滉均 » 9ヶ月前

新しい添付ファイルはまだ確認してませんが、ひとつ言っておきます。
output_d.zipの中身確認してみましたか?quoyletestなんてフォルダは入っていませんよ。
There is no royal road to learning.
codeタグで指定できる言語

アバター
keito94
記事: 264
登録日時: 1年前
連絡を取る:

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#28

投稿記事 by keito94 » 9ヶ月前

沖 滉均 さんが書きました: output_d.zipの中身確認してみましたか?quoyletestなんてフォルダは入っていませんよ。
ごめんなさい、ファイルの中身をよく確認すべきでした…。
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。

アバター
沖 滉均
記事: 237
登録日時: 7年前
住所: K県F市

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#29

投稿記事 by 沖 滉均 » 9ヶ月前

添付しているファイルはあなたの現在確認しているコードですか?
違いますよね
nindexが正しい値を返さない以前にエラーが発生するはずですけどもね。
使用方法の誤りが色々ありますし、あなたがスルーしていた下記の件も直っていませんし(load関数そのものではなくても使い方の誤りを指摘していますよ)
http://dixq.net/forum/viewtopic.php?f=3&t=19442#p147088
そもそも、なぜ複数の人から指摘・回答があっても1人にしか返信をしないんでしょう?

デバッグのやり方ややることについても前のトピで返信ついていますよね
このトピでも返信ついてますよね
何度このやり取りを繰り返せば良いんでしょうか?
There is no royal road to learning.
codeタグで指定できる言語

アバター
keito94
記事: 264
登録日時: 1年前
連絡を取る:

Re: Pythonのファイルのバイト単位でのランダムアクセスについて

#30

投稿記事 by keito94 » 9ヶ月前

asd さんが書きました:添付されているoutput_d.htmってマップエディタQuoyleに附属しているヘルプファイルの一部じゃないですか?
それを勝手に転載するのはよくないのではと思います。
ごめんなさい…。勝手な転載等はしないよう心がけます…。
いろいろツッコミを入れたいところですがどうせスルーされちゃうと思うので1点のみに絞って指摘しておきます。
エラーが出たからだれかデバッグしてー、直し方教えてーではデバッグにはなりませんよ。
・エラーメッセージが何を意味しているか調べましたか?
・発生している場所がどこかは分かりますか?
・printデバッグで各パラメータを調べましたか?

もし自分でデバッグにあたりやったことがあればやったことを書いておくとよいですよ。
分かりました、書きますね。

コード:

    def load(self,val,byte = 1):
        self.fn.seek(val)
        data = self.fn.read(byte)
        # ここでエラーが出る。
        self.fn.seek(-val)
        return data
のうち、self.fn.seek(-val)が悪さをすることに気づき、
なんとかself.fn.seek(-val)を取り除きました。
あと、get_layerに違和感があることに気づき、

コード:

    def get_layer(self, index):
        print("レイヤーを読み取ります。")
        # メモリと範囲をチェック
        if self.LAYER_C > index:
            return None

        return 16 + self.MAP_W * self.MAP_H * self.bysize * (index-1)

そして、頭を悩ませた以下のエラーの原因もわかりました。

コード:

  File "C:/Users/keito940/PycharmProjects/quoyletest/test.py", line 53, in <module>
    main()
  File "C:/Users/keito940/PycharmProjects/quoyletest/test.py", line 41, in main
    map_data = map.data_load()
  File "C:/Users/keito940/PycharmProjects/quoyletest\quoyle\map.py", line 80, in data_load
    map_data[i].append(self.get_pos(1, j, i))
IndexError: list index out of range
マップデータを表す配列が一列しかない上に、存在しない二列目に書き込もうとして以上のエラーが発生している模様です。
解決方法は、新たに二列目の配列を作る必要がある模様です。

コード:

    def data_load(self):
        map_data = [[]]
        # 開始時の位置を決める。
        for i in range(self.MAP_H):
            for j in range(self.MAP_W):
                if i < 0 and j == 0:
                    map_data.append([self.get_pos(1, j, i)])
                else:
                    map_data[i].append(self.get_pos(1, j, i))

        return map_data

ですが、二列目の配列が生成されず、無効な配列を参照しているというエラーが出てしまいます。
どうやって、二列目の配列を生成されるのでしょうか?
添付ファイル
quoyletest.zip
(22.41 KiB) ダウンロード数: 17 回
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。

返信

“C言語何でも質問掲示板” へ戻る