0

この質問は、現在の作業ディレクトリに .app/exe として読み書きする Python アプリに関するものです。

.txt ファイルへのパスは正常に取得できましたが、ファイルを開いて内容を読み取ろうとすると、データが適切に抽出されていないようです。

関連するコードは次のとおりです。

def getLines( filename ):
    path = Cocoa.NSBundle.mainBundle().bundlePath()

    real_path = path[0: len(path) - 8]

    print real_path

    f = open(real_path + filename, 'r') # open the file as an object

    if len(f.read()) <= 0:
        lines = {}                  # list to hold lines in the file
        for line in f.readlines():  # loop through the lines
            line = line.replace( "\r", "    " )
            line = line.replace( "\t", "    " )
            lines = line.split("    ")      # segment the columns using tabs as a base
        f.close()                   # close the file object

        return lines

lines = getLines( "raw.txt" )
for index, item in enumerate( lines ):        # iterate through lines
    # ...

これらは私が得ているエラーです:

  • 30/09/2012 10:28:49.103 [0x0-0x4e04e].org.pythonmac.unspecified.main: for index, item in enumerate( lines ): # 行を繰り返す
  • 30/09/2012 10:28:49.103 [0x0-0x4e04e].org.pythonmac.unspecified.main: TypeError: 'NoneType' オブジェクトは反復可能ではありません

エラーの意味はある程度理解できますが、.app フォームではないスクリプトを実行すると、これらのエラーが発生せず、データが正常に抽出されるため、フラグが立てられる理由がわかりません。

4

1 に答える 1

4

読み取りポインターをリセットしないと、ファイルを 2 回読み取ることはできません。さらに、あなたのコードは、ファイルが適切に読み取られるのを積極的に妨げています。

あなたのコードは現在これを行っています:

f= open(real_path + filename, 'r')  # open the file as an object

if len(f.read()) <= 0:
    lines = {}                  # list to hold lines in the file
    for line in f.readlines():  # loop through the lines

この.read()ステートメントは、ファイル全体を一度にメモリに読み込むことができるため、読み取りポインターが最後に移動します。ループオーバー.readlines()は何も返しません。

.read()ただし、呼び出しで何も読み取れなかった場合にのみ、そのコードを実行することもできます。あなたは基本的に言っています:ファイルが空の場合は行を読み取り、そうでない場合は何も読み取らないでください。

最終的に、これはgetlines()関数が常に を返しNone、後で表示されるエラーにつながることを意味します。

if len(f.read()) <= 0:完全に緩めます:

f= open(real_path + filename, 'r')  # open the file as an object

lines = {}                  # list to hold lines in the file
for line in f.readlines():  # loop through the lines

lines = {}ファイルの各行で変数を置き換えるため、その後は何もしません: . おそらく、代わりにリストを作成して追加するつもりでした:lineslines = line.split(" ")

f= open(real_path + filename, 'r')  # open the file as an object

lines = []              # list to hold lines in the file
for line in f.readlines():  # loop through the lines
    # process line
    lines.append(line.split("    "))

別のヒント:real_path = path[0: len(path) - 8]に書き換えることができますreal_path = path[:-8]。ただし、パスを操作するためにos.pathモジュールを調べたいと思うでしょう。そこにいるあなたにとって、os.path.split()電話の方がより適切に、より確実に機能すると思います。

于 2012-09-30T09:43:30.910 に答える