0

ことを確認してください

a) 各行の長さは 4 列です

b) プログラムの最後に改行 ('\n') があっても失敗しないようにする

def ask_for_filename():
    filename=raw_input("Please enter file name: ")
    return filename

def read_data(filename):
        with open(filename) as f:
           data = f.readlines()

        i = 0
        for line in data:
            lineContains = line.split('\t')
            lineLength = len(lineContains)  #calculate elements


            i = i+1

            if lineLength < 3 and i < len(data):        
                print "File is invalid format."

        f.close()
        return data

コードのこの部分が機能しないため、問題のある場所を修正してください。

        i = 0
        for line in data:
            lineContains = line.split('\t')
            lineLength = len(lineContains)  #calculate elements


            i = i+1

            if lineLength < 3 and i < len(data):        
                print "File is invalid format."

サンプル ファイルの内容:

完全なファイル:

AUTHOR(S)   YEAR    TITLE   JOURNAL/CONFERENCE

Accot;Zhai  2001    Scale effects in steering law tasks Proc. ACM CHI

Acredolo    1977    Developmental Changes in the Ability to Coordinate Perspectives of a Large-Scale Space  Developmental Psychology

Aginsky;Harris;Rensink;Beusmans 1997    Two strategies for learning a route in a driving simulator  Journal of Environmental Psychology

不完全なファイル (前述のコードはこれらの種類のファイル用です):

AUTHOR(S)   YEAR    TITLE   JOURNAL/CONFERENCE

Accot;Zhai  2001    Scale effects in steering law tasks Proc. ACM CHI

Acredolo    Developmental Changes in the Ability to Coordinate Perspectives of a Large-Scale Space  Developmental Psychology

Aginsky;Harris;Rensink;Beusmans 1997    Two strategies for learning a route in a driving simulator  Journal of Environmental Psychology

Agrawala;Beers;Frohlich;Hanrahan;McDowall;Bolas 1997    The two-user responsive workbench: Support for collaboration through individual views of a shared space Proc. ACM SIGGRAPH

Ahmadabadi;Eiji 1996    Cooperation strategy for a group of object lifting robots   Proc. of IROS
4

2 に答える 2

1

あなたのコードが「プログラムの残りの部分にまったく影響を与えない」と不平を言う.

関連するコード内には、データを変更したり、制御フローを変更したりするものは何もないため、もちろんプログラムの残りの部分には影響しません。したがってread_data、有効または無効にかかわらず、ファイル内のすべての行が常に返されます。

プログラムの残りの部分にどのように影響を与えたいかを説明していないので、あなたが望むことを行う方法を示すのは難しいです.しかし、私は何かを行う方法を示すことができます.

たとえば、すべての行を返す代わりに、有効な行だけを返します。

i = 0
result = []
for line in data:
    lineContains = line.split('\t')
    lineLength = len(lineContains)  #calculate elements

    i = i+1

    if lineLength < 3 and i < len(data):
        print "File is invalid format."
    else:
        result.append(line)

return result

または、何かを返すのではなく、例外を発生させるには:

i = 0
for line in data:
    lineContains = line.split('\t')
    lineLength = len(lineContains)  #calculate elements

    i = i+1

    if lineLength < 3 and i < len(data):
        raise ValueError("File is invalid format.")

return data

一方、コードには他にもいくつかの問題があります。

ブロックf.close()で使用fした後に呼び出してはいけません。with通常、あなたは幸運に恵まれ、無害になりますが、「通常は無害で決して役に立たない」というコードは、あなたが望む種類のものではありません。

何かのすべての行を数えたい場合は、明示的i = i+1にループに追加しないでくださいenumerate

また、i < len(data)常に真であるため、が何をすべきかわかりません。だから私はそれを省きます。(ということはi、あなたがそれを使う唯一の場所なので、私は完全に除外することもできます…しかし、私はそれを残しますので、あなたに見せることができますenumerate.

電話する正当な理由はほとんどありませんreadlines()。返されるリストと同じように、ファイルはすでに行でいっぱいのイテラブルreadlinesです。必要に応じてではなく、ファイル全体を一度に読み取ることで、コードを遅くし、より多くのメモリを消費するように強制しただけです。

したがって、これがスキップする悪い行のバージョンです。

def read_data(filename):
    result = []
    with open(filename) as f:
        for i, line in enumerate(f):
            lineContains = line.split('\t')
            lineLength = len(lineContains)  #calculate elements
            if lineLength < 3:        
                print "File is invalid format."
            else:
                result.append(line)
    return result

一方、無効な行が 100000 行ある場合、すべての無効な行に対して警告を表示しますか? そうでない場合は、これをより簡単にすることができます。

def read_data(filename):
    def bad_line(line):
        lineContains = line.split('\t')
        lineLength = len(lineContains)  #calculate elements
        return lineLength < 3
    with open(filename) as f:
        return [line for line in f if not bad_line(line)]
于 2013-05-03T18:57:48.963 に答える