2017-04-16 103 views
0
from sys import argv 

script,inputfile=argv 

def print_all(file): 
    print(file.read()) 

def rewind(file): 
    file.seek(0) 

def print_line(line,file): 
    print(line,file.readline()) 

currentFile=open(inputfile) 

print("Let's print the first line: \n") 

print_all(currentFile) 

print("Rewind") 
rewind(currentFile) 

currentLine=1 

print_line(currentLine,currentFile) 

currentLine+=1 

print_line(currentLine,currentFile) 


currentLine+=1 


print_line(currentLine,currentFile) 

我有这段代码,这个工程,但我不明白的是,当我重写打印语句在打印行函数打印(file.readline(line))我得到意想不到的输出。我使用Python 3.6python readline没有给出预期的输出

正确的输出

This is line 1 
This is line 2 
This is line 3 
Rewind 
This is line 1 

This is line 2 

This is line 3 

不正确的输出

This is line 1 
This is line 2 
This is line 3 
Rewind 
T 
hi 
s i 

为什么会发生这种情况?

+1

你能告诉我们该文件的内容。 –

+0

无法用包含这三行的示例文件重现。也许你的输入文件有文本编辑器无法识别的换行符?尝试'print(repr(file.read()))' – poke

+0

这是行1 这是行2 这是行3 –

回答

1

这是因为file.readline()函数定义的,

readline(...) 
    readline([size]) -> next line from the file, as a string. 

    Retain newline. A non-negative size argument limits the maximum 
    number of bytes to return (an incomplete line may be returned then). 
    Return an empty string at EOF. 

因此,当传递线数作为参数,你是actullay告诉它获取与每个currentLine+=1递增字节数。

如果你只是打算打印由线内容行,你可以参考这个,

def print_file_line_by_line(currentFile): 
    for line in currentFile: 
     print line.strip('\n') 

或者这也适用

def print_file_line(currentLine, currentFile): 
    try: 
     print currentFile.read().split('\n')[currentLine-1] 
    except IndexError as e: 
     print str(currentLine)+' is greater than number of lines in file' 
     print ''+str(e) 
+0

但OP永远不会传递行号。 OP只统计他们打印的行号*与文件中的下一行一起。 'currentLine'永远不用于与文件进行交互。 – poke

+0

@poke:我认为OP在说谎他们的代码。这是他们得到的输出的唯一明智的解释,所以得到感谢我的upvote – Eric

+0

@Eric正如我在对问题的评论中解释的那样,输入文件可能具有OP的文本编辑器不可见的字符这算作换行符到'readline'。即使OP在说谎他们的代码,他们在问题中显示的代码是*非常好*并且完全按预期工作,所以这个答案没有帮助。 – poke