2016-05-10 2 views
0

事前に申し訳ありません - これはおそらく愚かな質問ですので、私はコーディングに新しいです!私は明示的にそれを要求していないときに、なぜpythonが空のリストを返すのですか?

ローカルのテキストファイル(私はhttp://norvig.com/big.txtのテキストをダウンロードしました)をスキャンして、このファイルからランダムな行を読み取り、リストに印刷しようとしています。

しかし、私は空の行、テキストを含む行だけを印刷したくありません。

だから私は、次のコードを使用しようとしました:

import random 

with open('C:\\big.txt', 'r') as f: 
    while True: 
     random_line_str = random.choice(f.readlines()) 
     random_line_lst = random_line_str.split() 
     if random_line_lst != []: 
      print(random_line_lst) 
      break 

だから、これはテキストを含む行のために正常に動作します。しかし、それはまた、時折、次のエラーを吐く:私はすべてのアイデアは、私はこの出来事を回避し、線のみを返すことができるか...

を正直に言うと、ここで何が起こっているかの手がかりを

Traceback (most recent call last): 
    File "C:\Python\lib\random.py", line 253, in choice 
    i = self._randbelow(len(seq)) 
    File "C:\Python\lib\random.py", line 230, in _randbelow 
    r = getrandbits(k)   # 0 <= r < 2**k 
ValueError: number of bits must be greater than zero 

During handling of the above exception, another exception occurred: 

Traceback (most recent call last): 
    File "C:/PycharmProjects/Testing/Test.py", line 5, in <module> 
    random_line_str = random.choice(f.readlines()) 
    File "C:\Python\lib\random.py", line 255, in choice 
    raise IndexError('Cannot choose from an empty sequence') 
IndexError: Cannot choose from an empty sequence 

持っていませんテキストを含んでいますか?

乾杯!項目は(常にtrueになりますitem not in []を意味する)は常にfalseをされる、空のリストにある場合

+2

'while true'を' for line in f'に置き換えてください。 –

+0

ループの前にデッドラインを一度呼び出して結果リストを保存するだけです。 –

答えて

2

項目が空のリストがある場合は、この行はチェックしません、それはチェック:

if random_line_lst not in []: 

bool([])がFalseであることから、ちょうど何を行うことができますがされて:あなたはおそらく明示的に空のリストをチェックしたい場合は、!=演算子を使用

if random_line_lst: 

。上記を使用して

if random_line_lst != []: 

、あなたのコードは次のようになります。

import random 

with open('C:\\big.txt', 'r') as f: 
    while True: 
     random_line_str = random.choice(f.readlines()) 
     random_line_lst = random_line_str.split() 
     if random_line_lst: 
      print(random_line_lst) 
      break 

EDIT random.choiceについては

、問題はあなたが繰り返しf.readlines()random.choiceを呼び出しているです。 Readlinesは、最初の呼び出しの各行だけを返します。その後、空のシーケンスを返します。 random.choiceは空のシーケンスから項目を選択できません。より良い戦略は、このされています

import random 

with open('C:\\big.txt', 'r') as f: 
    lines = f.readlines() 
    while True: 
     random_line_str = random.choice(lines) 
     random_line_lst = random_line_str.split() 
     if random_line_lst: 
      print(random_line_lst) 
      break 

それとも、あなたは離れてランダム性から破ることができる場合は、以下を使用します。

with open('C:\\big.txt', 'r') as f: 
    for line in f: 
     line_lst = line.split() 
     if line_lst: 
      print(line_lst) 
      break 
+0

は、 'random_line_list'が何であっても、空のリストのメンバーではないので、' []の中にないrandom_line_listは常に 'True'にならないでしょう... – mgilson

+0

ああ、すみません、みんな速く返事をするだろう! – chewflow

+0

私は少し質問を変えました...それは厄介です – chewflow

1

print out if random_line_lst is not []

いいえ、あなたはそれをチェックされていません。むしろ、[]にリスト変数random_line_lstが存在しないかどうかをチェックしています。これは、[]が空で何も存在しないため、常に真です。だからif random_line_lst not in []:のチェックが正しくない。あなたがチェックする必要があり

の代わりに:

if len(random_line_lst) > 0: 

またはショートカット(とより良い形)は、空のリストは偽なので

if random_line_lst: 

をチェックすることです。

また、f.readlines()はループ内では常に呼び出すことができません。ループを開始する前に、その行を変数に保存する必要があります。そうしないと、ループが次に実行されるときにIndexErrorが返されます。その理由は、最初の呼び出しではf.readlines()です。ファイル全体が読み込まれ、次の呼び出しファイルの位置はファイルの終わりにあります。ファイルの位置をゼロにしない限り、次の読み取りは空のリストを返します。あなたの場合は、readlines()コールをループから外すことができます。

with open('C:\\big.txt', 'r') as f: 
    lines = f.readlines() 
    while True: 
     random_line_str = random.choice(lines) 
+0

ねえ、ありがとう。あなたは正しいです、 '> 0'チェックはまさに​​私が探していたものです。私はまだ毎時上記の例外を表示していますが、理由はわかりません。 – chewflow

+0

ああ!だから私はIndexErrorを得ているのです。うーん、最初に選んだ行が空であれば、それをループバックして別のランダムな行を読み込むことはできますか?私。テキストが含まれるまで無作為な線を選んでください。 – chewflow

+0

@chewflowはエラーのより良い説明を追加しました。編集を確認してください。 – taskinoor

1

私はラインが空の場合でも、あなたはまだその行に関連付けられたキャリッジリターンを持つことになりますので、あなたが、このような状況でストリップ方法を利用することができます感じています。したがって、次の条件を確認することができます

line.strip() != '' #checking if the line is empty by removing the Carriage return 

with open('fdf.txt','r') as f: 
    for line in f: 
     if line.strip() != '' : 
      print(line) 

希望すると助かります。

+0

ねえ、おかげで、それは私の試みよりも見栄えが悪いです。それを見てみましょう:-) – chewflow

関連する問題