读取文本文件只返回第一行

时间:2014-07-29 21:31:10

标签: python python-3.x

我正在尝试创建一个程序,询问用户他们想要查看的文本文件行数。我需要这样做,如果用户输入超过行数,那么我在文件中打印出整个文件。

下面是我到目前为止的代码,但我目前遇到的问题是它只打印出文本的第一行,无论我输入什么号码。

使用Python 3.4:

def readFile(): 
    """retrieve the file my_data.txt"""
    try:
        textFile = open("my_data.txt","r")
        return textFile
    except:
        print("The file does not exist")
        return

def readLines():    
    textFile = open("my_data.txt","r")  
    file_lines = textFile.readline()        
    print(file_lines)

#main
while True:
    cmd = int(input("\nEnter the number of lines you would like to read: "))    
    readLines()

4 个答案:

答案 0 :(得分:0)

def get_user_int(prompt):
   while True:
      try: 
         return int(input(prompt))
      except ValueError:
         print("ERROR WITH INPUT!")

print("\n".join(textFile.readlines()[:get_user_int("Enter # of Lines to view:")]))

可能?

答案 1 :(得分:0)

那是by design

a = file.readline()

将一行读入a。您正在打开文件,并且每次都读取一行(第一行)。

是:

b = file.read()

将整个文件作为一个字符串读入b

要阅读x行,您只需多次调用readline() x - 每次只返回一个字符串时,请记住这一点。您可以将它们存储在列表中,也可以将它们连接成一个字符串,或者任何最合适的字符串。

请注意,完成后,您还应该close()该文件。

也许最简单的技术是:

f = file.open('myfile.txt', 'r')
lineNum = 0
for line in f:
    if lineNum < x:
        print(line)
        lineNum += 1

答案 2 :(得分:0)

这是一种解决问题的方法,但它可能过于复杂。

import os
import sys

def readFile(file_name):
    # check if the file exists
    if not os.path.exists(file_name):
        sys.stderr.write("Error: '%s' does not exist"%file_name)
        # quit
        sys.exit(1)

    textFile = open(file_name, "r")
    file_lines = textFile.read()
    # split the lines into a list
    file_lines = file_lines.split("\n")
    textFile.close()

    is_number = False
    while not is_number:
        lines_to_read = input("Enter the number of lines you would like to read: ")
        # check if the input is a number
        is_number = lines_to_read.isdigit()
        if not is_number:
            print("Error: input is not number")

    lines_to_read = int(lines_to_read)
    if lines_to_read > len(file_lines):
        lines_to_read = len(file_lines)

    # read the first n lines
    file_lines = file_lines[0:lines_to_read]
    file_lines = "\n".join(file_lines)
    print(file_lines)

readFile("my_data.txt")

答案 3 :(得分:0)

def read_file(file_name, num):
    with open(file_name, 'r') as f:
        try:
            for i in xrange(num):
                print f.next()
        except StopIteration:
            print 'You went to far!'

从你的问题来看,我假设你对Python很新。这里有一些事情,所以我会花时间解释它们:

'with'语句创建所谓的'上下文'。因此,跟随缩进的任何内容都在该上下文中。我们知道在这种情况下,文件'f'是开放的。当我们离开上下文时,它会关闭。 Python通过在进入和离开上下文时分别调用f的'enter'和'exit'函数来实现这一点。

Python的标准原则之一是“请求宽恕比要求许可更好”。他在我们的上下文中意味着,最好是尝试重复调用我们文件中的next(),而不是检查我们是否在最后。如果我们在最后,它将抛出一个StopIteration异常,我们可以捕获它。

最后,xrange产生一个'发电机'。现在,我不打算详细讨论这个问题,但如果你愿意的话,有一个很好的答案here。基本上,它会向您传输数字,而不是传递给您一长串的数据。而且,在我们的例子中,我们从不需要整个列表,我们只需要迭代一段时间。