2
import os.path

endofprogram=False
try:

   filename1=input("Enter input file: ")
   filename2=input("Enter output file: ")

   while os.path.isfile(filename2):
       filename2=input("File Exists! Enter new name for output file: ") 

except IOError:
   print("Error opening file - End of program")
   endofprogram=True

if(endofprogram == False):
   infile=open(filename1, "r")
   content=infile.read()
   lines=[]
   words=[]

   lines=content.split('\n')
   print("Total animals=",len(lines))  

私はこのプログラムに取り組んでおり、ファイルを扱う必要があります。私はファイルを持っています:

#color     size    flesh     class
brown     large    hard      safe
green     large    hard      safe
red       large    soft      dangerous
green     large    soft      safe


red       small    hard      safe
red       small    hard      safe
brown     small    hard      safe
green     small    soft      dangerous
green     small    hard      dangerous
red       large    hard      safe
brown     large    soft      safe
green     small    soft      dangerous
red       small    soft      safe
red       large    hard      dangerous
red       small    hard      safe
green     small    hard      dangerous 

そして、次の質問に答える必要があります。

  • 動物の総数は?
  • 危険な動物の総数は?
  • 安全な大型動物の数は?

これまでのところ、動物の総数を出力できますが、不要なコメント行とともに空白が含まれています。現在、動物の総数については、印刷されるのは 16 であるはずの場合、19 です。そして、その後の 2 つの質問をどこから始めればよいかわかりません。

4

4 に答える 4

1

次のように、ファイル全体を読み取るよりも簡単に、ファイルを 1 行ずつ処理する必要があります。

infile = open('entrada', 'r')

animals = 0
safe_animals = 0
dangerous_animals = 0

for line in infile:
    line_components = line.strip().split()
    if line_components:
        animals += 1

        if line_components[3] == 'dangerous':
            dangerous_animals += 1
        elif line_components[3] == 'safe' and line_components[1] == 'large':
            safe_animals += 1

print "%i animals" % animals
print "%i safe animals" % safe_animals
print "%i dangerous animals" % dangerous_animals
于 2013-11-06T23:28:05.647 に答える
1

これを行うための非常に冗長な方法を次に示します。

color, size, flesh, clas = 0, 1, 2, 3 #column index
animals = []
with open ('animals.txt') as f:
    for line in f:
        if line[0] in '#\n': continue
        animals.append(line.split())
print(animals)
print(len(animals))
print(sum(1 for animal in animals if animal[clas] == 'dangerous'))
print(sum(1 for animal in animals if animal[clas] == 'safe' and animal[size] == 'large'))

説明: すべての行を繰り返します。行が空またはコメントの場合はスキップします。それ以外の場合は、行を分割してすべての動物に追加します。各動物は 4 つの要素のリストです (したがって、最初の行の列インデックス)。次に、一致する動物をフィルタリングしてカウントします。

于 2013-11-06T23:39:00.957 に答える
0

データベース、yaml、または json を使用してデータを保持してみませんか?

プレーンテキストファイルよりもはるかに優れており、解析/クエリが簡単です.

json http://docs.python.org/3.3/library/json.html pyYaml http://pyyaml.org/wiki/PyYAML

于 2013-11-06T23:49:08.207 に答える
0

コンテンツを一度にすべて読み取ってから分割するのではなくcontent、次のようにファイル オブジェクトに readlines() メソッドを使用することをお勧めします。

lines = infile.readlines()

次に、いくつかのフィルタリングを実行して、列を解析する前にコメント行や空白行を削除できます。

例は、リスト内包表記lines = [line for line in lines if len(line.strip()) > 0]です。コメント行を取り除くために、同様のことを行うことができます。

このsplit方法は、個々の行を実際に解析するのにより適しています。

于 2013-11-06T23:27:26.253 に答える