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 

我应该回答以下问题:

  • 动物总数?
  • 危险动物的总数?
  • 安全的大型动物有多少?

到目前为止,我可以打印出动物的总数,但它包括空格以及我不想要的注释行。目前对于动物的总数,打印的是 19,而应该是 16。我不知道从哪里开始接下来的两个问题。

4

4 回答 4

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'))

说明:遍历所有行。如果该行为空或有注释,请跳过它。否则拆分线并将其添加到所有动物。每个动物都是四个元素的列表(因此第一行中的列索引)。现在只需过滤和计算匹配的动物。

于 2013-11-06T23:39:00.957 回答
0

content您可能希望对文件对象使用 readlines() 方法,而不是一次读取所有内容,然后拆分,如下所示:

lines = infile.readlines()

然后你可以做一些过滤,在解析列之前删除注释和/或空白行。

一个例子是列表理解lines = [line for line in lines if len(line.strip()) > 0]。您可以执行类似的操作来删除注释行。

split方法更适合实际解析每一行。

于 2013-11-06T23:27:26.253 回答
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 回答