从文件输入

也可以从文件中读取输入。可以使用内置函数 open 打开文件。使用 with <command> as <name> 语法(称为上下文管理器)使得使用 open 并获得文件的句柄非常容易:

with open('somefile.txt', 'r') as fileobj:
    # write code here using fileobj

这可确保在代码执行离开块时文件自动关闭。

文件可以以不同的模式打开。在上面的示例中,文件以只读方式打开。要打开现有文件以供阅读,请使用 r。如果要将该文件作为字节读取,请使用 rb。要将数据附加到现有文件,请使用 a。使用 w 创建文件或覆盖任何同名的现有文件。你可以使用 r+打开文件进行读写。open() 的第一个参数是文件名,第二个是模式。如果模式为空白,则默认为 r

# let's create an example file:
with open('shoppinglist.txt', 'w') as fileobj:
    fileobj.write('tomato\npasta\ngarlic')

with open('shoppinglist.txt', 'r') as fileobj:
    # this method makes a list where each line 
    # of the file is an element in the list
    lines = fileobj.readlines()

print(lines)
# ['tomato\n', 'pasta\n', 'garlic']

with open('shoppinglist.txt', 'r') as fileobj:
    # here we read the whole content into one string:
    content = fileobj.read()
    # get a list of lines, just like int the previous example:
    lines = content.split('\n')

print(lines)
# ['tomato', 'pasta', 'garlic']

如果文件的大小很小,则可以安全地将整个文件内容读入内存。如果文件非常大,通常最好逐行或按块读取,并在同一循环中处理输入。要做到这一点:

with open('shoppinglist.txt', 'r') as fileobj:
    # this method reads line by line:
    lines = []
    for line in fileobj:
        lines.append(line.strip())

读取文件时,请注意特定于操作系统的换行符。虽然 for line in fileobj 会自动将它们剥离,但在读取的行上调用 strip() 总是安全的,如上图所示。

打开的文件(上例中的 fileobj)始终指向文件中的特定位置。首次打开它们时,文件句柄指向文件的最开头,即 0 的位置。文件句柄可以用 tell 显示它的当前位置:

fileobj = open('shoppinglist.txt', 'r')
pos = fileobj.tell()
print('We are at %u.' % pos) # We are at 0.

在读取所有内容后,文件处理程序的位置将指向文件的末尾:

content = fileobj.read()
end = fileobj.tell()
print('This file was %u characters long.' % end)
# This file was 22 characters long.
fileobj.close()

文件处理程序位置可以设置为所需的任何位置:

fileobj = open('shoppinglist.txt', 'r')
fileobj.seek(7)
pos = fileobj.tell()
print('We are at character #%u.' % pos)

你还可以在给定呼叫期间从文件内容中读取任何长度。为此,传递 read() 的参数。当没有参数调用 read() 时,它将一直读到文件结尾。如果传递参数,它将读取该字节数或字符数,具体取决于模式(分别为 rbr):

# reads the next 4 characters 
# starting at the current position
next4 = fileobj.read(4)
# what we got?
print(next4) # 'cucu'
# where we are now?
pos = fileobj.tell()
print('We are at %u.' % pos) # We are at 11, as we was at 7, and read 4 chars.

fileobj.close()

要演示字符和字节之间的区别:

with open('shoppinglist.txt', 'r') as fileobj:
    print(type(fileobj.read())) # <class 'str'>

with open('shoppinglist.txt', 'rb') as fileobj:
    print(type(fileobj.read())) # <class 'bytes'>