2016-04-17 6 views
-1

こんにちはリスト内に「CREATE TABLE」を含むすべての行の位置を保存します。 a)より適切な方法ですそれ? (私はPythonの初心者です) b)iteratorにtellが使用されているのはなぜですか?私はそれが読み込み方法(または同等のもの)だと思ったので、ファイルの反復処理を傷つけてはいけないと言っています。python 3:forループでファイルtell()を使用すると、エラーが発生する

ので、私は以下のクラスがあります。

class SQLParser(object): 
def __init__(self,filename): 
    self.file = open(filename,'r') 
    self.createTablePositions=[] 
    self.insertIntoPositions=[] 

def findCreateTable(self): 
    for line in self.file: 
     if line.find("CREATE TABLE") is 0: 
      print(line) 
      self.createTablePositions.append(self.file.tell()) 



sqlhandler = SQLParser("sql.sql") 
sqlhandler.findCreateTable() 
print(sqlhandler.createTablePositions) 

次のエラー生成: "トレースバック(最新の呼び出しの最後): ファイル" C:/Users/user/PycharmProjects/sqlparser/sqlparser.pyを」 sqlhandler.findCreateTable() ファイルの行18、 "C:/Users/user/PycharmProjects/sqlparser/sqlparser.py"、ライン12、findCreateTableで curPos = self.file.tell() OSErrorの:占いnext()コールで無効になった位置 "

私はネットとstackoverflowをイアリングが、私は私の問題に直接解決策を見つけることができませんでした。 - 現在の解決策はnext()メソッドを書き換えることですが、私の知るところではありません。私はこのエクササイズがそれを目指しているのか疑問です。

あなたのアドバイスは非常にappriciatedされてくださいしてください!

答えて

0

初心者にとっては、決してファイルを閉じることはありません。

エラーは、主にtell()メソッドの内部動作のために発生します。 for line in fileを介してファイルを反復することにより、内部操作next()が常に呼び出され、tell()メソッドの仕組みが壊れてしまいます。通常、ファイルからデータを読み取る特定の方法:readline()またはreadlines()を使用する方が適しています。 正確にはが何をしているのかわからない限り、OS(ファイルシステム)によって制御されるオブジェクトを反復処理すると、アクセス方法の競合(または時には)によってエラーが発生する可能性があります。

また、file.tell()メソッドは、カーソルの位置を現在の行ではなく返します。だから、

あなたはメソッドfile.tell()file.readline()を使用した後、20個の文字を持っていた最初の行を読んでいたこと22(文字の数と終了行の文字またはその他)を返すと言うのではなく、あなたが何をしているか、私はそれについて考えをお勧めしたい場合まったく違う

class SQLParser(object): 
    """ 
    Parses a SQL file. 
    """ 

    def __init__(self,filename): 
     self.createTablePositions= self.findCreateTable(filename) 
     self.insertIntoPositions=[] 

    def findCreateTable(self, filename): 
     temp = [] 
     with open(filename, 'r') as file: 
      # with operator closes the file upon exit of block 
      fileNum = 0 
      for line in file.readlines(): 
       if "CREATE TABLE" in line: 
        print(line) 
        temp.append(fileNum) 
       fileNum += 1 
     return temp 


sqlhandler = SQLParser("sql.sql") 
print(sqlhandler.createTablePositions) 

ここで、クラスオブジェクトの初期化時にファイルを解析します。

insertIntoPositionという別の方法でも同様の操作を行うことができます。

+0

こんにちは私は特定の言葉を取って、別のファイルでそれらを言い換えるためにcharatersの量が必要ですが、その方向は私が推測されます。 – LiorA

+1

hiyaおかげさまで、まずは、ファイルを閉じることに関しては正しいですが、クラスを終了していないので、最後にやることでした(btwはC++のようなものではありません - オブジェクトのデストラクタdoesnそれ自体では扱いませんか?)。 1つの最後の質問ファイル内の行16に移動する方法を教えてください。もしあなたがそれに答えることができれば(それはPythonのドキュメントで見つけようとしています)、それはすごいでしょう! (そのため、後でseek()を使うことができるようにtell()が必要なのです) – LiorA

+0

jumping lines:[linecache](https://docs.python.org/3.5/library/linecache。html) – Mixone

関連する問題